學習了好一段時間,效率極其低下ヽ(≧□≦)ノ
搜索學習各種各樣的,但是都沒見過好好整理的,極其麻煩,
特別是有的函數少見,整明白一個函數特別難,難得搜到,也難得看懂,忽然想起Easyx官網有介紹,人都傻了...(ˉ﹃ˉ)阿巴阿巴阿巴。。。
在此分享目前個人學習到的,成功達到學習目的的,成果,整合。
因為重要,所以前置!!!
1.使用函數的理論方面內容太多,還請自行學習,首建官網:https://docs.easyx.cn/zh-cn/reference
2.其他方面的理論知識也是如上,各求所需,下面會分享個人認為比較好的一些資源網站。
3.如果對Easyx一點都不懂,甚至還沒下載安裝,點擊這里—>https://codeabc.cn/bestans/a/concise-lesson-contents
獲取各種句柄:https://my.oschina.net/u/2314763/blog/422622 + https://www.cnblogs.com/zjutlitao/p/3889900.html
vs2019項目打包:https://blog.csdn.net/wangyunzhao007/article/details/84932389(注意漏了一個步驟:在創建Setup Project之前的配置界面 需要選擇解決方案 為(添加到解決方案)而不是(創建新解決方案),否則 項目輸出 會是 空白界面!!!)
下面是標題代碼:
windows框綜合
tip:代碼,注釋都有空白區分開,便於拆分理解。
簡單用例:
(兩個都是采用字符輸出來替代圖像,圖像投影簡單,可以照葫蘆畫瓢啦,設置下坐標就行)
#include<graphics.h> #include<windows.h> int main() { POINT p; HWND hd = GetForegroundWindow(); TCHAR S[]=_T("無論在哪里,我都愛你阿"); int X=640,Y=480;//大小可任意適度修改 initgraph(X,Y); int mx=GetSystemMetrics(SM_CXFULLSCREEN); int my=GetSystemMetrics(SM_CYFULLSCREEN); int width = X; //減去量不定,個例 if(width>textwidth(S))width-=textwidth(S); int high = Y; if(high>60*Y/480)high-=60*Y/480; while(1) { GetCursorPos(&p); int x=p.x*width/mx; int y=p.y*high/my; outtextxy(x,y,S); Sleep(10); //system("pause>nul"); //兩種清屏方式: //clearrectangle(x,y,x+textwidth(S),y+textheight(S)); cleardevice(); //system("pause>nul"); } return 0; }
#include<iostream> #include<windows.h> #include<graphics.h> using namespace std; int main() { HWND hd = GetForegroundWindow(); //這里是使用的Easyx繪圖投影,另外寫的用例基本window窗口的投影,兩種。 int X=640,Y=480;//大小可任意適度修改 int kuan=X; int gao=Y; int mx=GetSystemMetrics(SM_CXFULLSCREEN); int my=GetSystemMetrics(SM_CYFULLSCREEN); int a = 8, b = 16;//一個基本輸出單位所占像素大小:寬度,高度 char S[6][9]={"********","a a","a a","a a","a a","********"};//a+a 含有6個空格 TCHAR s1[] =_T( "████" ); TCHAR s2[] =_T( "a a");//含有12個空格 因為一個空格只占用4個寬度的像素 x2 才是理想圖像 TCHAR s3[] =_T( "a a"); TCHAR s4[] =_T( "a a"); TCHAR s5[] =_T( "a a"); TCHAR s6[] =_T( "████" ); initgraph(X, Y); while(1) { int i=0, k=0; TCHAR Len1[10],Len2[10]; //圖像的側邊 輸出該字符串所占高度和寬度 outtextxy(k, i++ * 16, s1); sprintf(Len1,_T("%d"),textheight(s1));sprintf(Len2,_T("%d"),textwidth(s1));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s2); sprintf(Len1,_T("%d"),textheight(s2));sprintf(Len2,_T("%d"),textwidth(s2));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s3); sprintf(Len1,_T("%d"),textheight(s3));sprintf(Len2,_T("%d"),textwidth(s3));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s4); sprintf(Len1,_T("%d"),textheight(s4));sprintf(Len2,_T("%d"),textwidth(s4));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s5); sprintf(Len1,_T("%d"),textheight(s5));sprintf(Len2,_T("%d"),textwidth(s5));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); outtextxy(k, i++ * 16, s6); sprintf(Len1,_T("%d"),textheight(s6));sprintf(Len2,_T("%d"),textwidth(s6));outtextxy(k+90,i*16-16,Len1);outtextxy(k+120,i*16-16,Len2); POINT p; GetCursorPos(&p); int x=p.x*kuan/mx; int y=p.y*gao/my; if(!x%a)x--; if(!y%b)y--; i++; outtextxy(k,++i*16-16,"投影像素坐標:");sprintf(Len1,_T("%d"),x); sprintf(Len2,_T("%d"),y);outtextxy(k+110,i*16-16,Len1);outtextxy(k+150,i*16-16,Len2); outtextxy(k,++i*16-16,"投影邏輯坐標:");sprintf(Len1,_T("%d"),y/b);sprintf(Len2,_T("%d"),x/a);outtextxy(k+110,i*16-16,Len1);outtextxy(k+150,i*16-16,Len2); // 需要判斷上邊界和下邊界,左邊界和右邊界 // 此外,因為是用的漢字,而漢字占用兩個基本字符的像素,所以需要判斷漢字中間位置的像素點 (不需要再寫代碼判斷) // 因此,比如第二行右邊的a的位置為(1,5),而實際顯示撞牆的坐標會是(1,5),(1,6),(1,7) 三個點 if((S[y/b][x/a+1]!=' '||S[y/b][x/a+2]!=' '||S[y/b+1][x/a+1]!=' '||S[y/b+1][x/a+2]!=' ')&&x/a+1<=8&&y/b<6)outtextxy(k, i++ * 16, "當前位置撞牆 "); else outtextxy(k, i++ * 16, "當前位置未撞牆"); outtextxy(x,y,"我"); Sleep(100); //system("pause>nul"); cleardevice(); } return 0; }
下面是經典使用案例(全屏鼠標精准投影操控游戲):
#include<stdio.h> #include<windows.h> #include<stdlib.h> #include<time.h> #define K 10 //寬 #define C 20 //長 #define D 7 //障礙間隔 #define L ((K-2)*7/8) //障礙最長值 int wo,I; void getmouse_() { HANDLE Hd=GetStdHandle(STD_OUTPUT_HANDLE); HWND hd=GetForegroundWindow(); POINT p; int high=K*15-45; int width=C*8; int max_x=GetSystemMetrics(SM_CXFULLSCREEN); int max_y=GetSystemMetrics(SM_CYFULLSCREEN); GetCursorPos(&p); int x=p.y*high/(double)max_y; int y=p.x*width/(double)max_x; int a=16,b=8; if(!x%a)x--; if(!y%b)y--; wo=x/a+1; I=y/b; } int main() { relife: //重玩 char a[K][C],game; DWORD S,E; //系統運行時間 S=GetTickCount(); float v=1; int random,d=D,start=0,score=1,speed,i,j; POINT q={0,0}; //和坐標有關的東西 LPPOINT s=&q; //和坐標有關的東西 for(i=0;i<K;i++) for(j=0;j<C;j++) a[i][j]=' '; //初始化地圖 for(i=0;i<C;i++) a[0][i]=a[K-1][i]='-'; //初始化邊界 srand((unsigned)time(0)); while(1) { getmouse_(); if(a[wo][I]=='*') break; else { goon: //復活 a[wo][I]='O'; } system("cls"); for(i=0;i<K;i++) { for(j=0;j<C;j++) { if(i==wo&&j==I) printf("@ "); //角色 else if(a[i][j]=='-'||a[i][j]=='*') printf("█"); //邊界和障礙 else printf(" "); } printf("\n"); } start++; if(start==7) { printf("1.鼠標控制移動\n"); printf("2.只要手速快,允許閃現穿牆(認真臉)\n"); printf("3.按任意鍵開始游戲\n\n\n\n"); score=0; system("pause"); } a[wo][I]=' '; for(i=0;i<C-1;i++) for(j=1;j<K-1;j++) a[j][i]=a[j][i+1]; //障礙移動 if(d==D) { random=rand()%(2*L)-L; //生成隨機障礙 if(random>K-2||random<(2-K)||(random<3&&random>-3)) random=3; if(random>0) for(i=1;random>0;random--,i++) a[i][C-1]='*'; else for(i=K-2;random<0;random++,i--) a[i][C-1]='*'; d=0; score++; speed=1000/score; } else for(i=1;i<=K-2;i++) a[i][C-1]=' '; printf("得分:%d",score); E=GetTickCount(); if(v<1000/((float)(E-S))&&start>=7) v=1000/((float)(E-S)); printf(" 速度:%.3lf格/秒",v); S=GetTickCount(); if(start>=7) Sleep(speed); d++; } printf("\n游戲結束\n\n\n1.按(空格+任意鍵)可復活繼續游戲\n2.按(非空格+任意鍵)重新開始游戲\n"); scanf("%c",&game); getchar(); if(game=='\n') goto relife; if(game==' ') goto goon; return 0; }
