#include <Windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { static TCHAR szAppName[]=TEXT("HexCalc"); MSG msg; HWND hwnd; WNDCLASS wndclass; wndclass.style=CS_HREDRAW|CS_VREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; //注册自己的对话框时,所必须的 wndclass.cbWndExtra=DLGWINDOWEXTRA; wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(hInstance,szAppName); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } hwnd=CreateDialog(hInstance,szAppName,0,NULL); ShowWindow(hwnd,iCmdShow); while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } void ShowNumber(HWND hwnd,UINT iNumber) { TCHAR szBuffer[20]; wsprintf(szBuffer,TEXT("%X"),iNumber); //VK_ESCAPE是什么意思 SetDlgItemText(hwnd,VK_ESCAPE,szBuffer); } DWORD CalcIt(UINT iFirstNum,int iOperatation,UINT iNum) { switch(iOperatation) { case '=':return iNum; case '+':return iFirstNum+iNum; case '-':return iFirstNum-iNum; case '*':return iFirstNum*iNum; case '&':return iFirstNum&iNum; case '|':return iFirstNum|iNum; case '^':return iFirstNum^iNum; case '<':return iFirstNum<<iNum; case '>':return iFirstNum>>iNum; case '/':return iNum?iFirstNum/iNum:MAXDWORD; case '%':return iNum?iFirstNum%iNum:MAXDWORD; default:return 0; } } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { static BOOL bNewNumber=TRUE; static int iOperation='='; static UINT iNumber,iFirstNum; HWND hButton; switch(message) { //下面的很多都没有加break,直接顺序执行下去,注意顺序不能改 //////////////////////////////////////////////// //当按下一个按键时,会触发三个消息WM_KEYDOWN,WM_CHAR,WM_KEYUP //当按下的不是方向左键时,系统就不处理WM_KEYDOWN消息,直接break,处理WM_CHAR消息 //////////////////////////////////////////////// case WM_KEYDOWN: //如果按下键盘左方向键,就相当于是VB_BACK,减去最后一位 if(wParam!=VK_LEFT) break; wParam=VK_BACK; //所有字符都先通过CharUpper转换成大写 case WM_CHAR: //判断是不是回车 if((wParam=(WPARAM)CharUpper((TCHAR*)wParam))==VK_RETURN) wParam='='; //通过键盘按键来判断是哪一个,来实现相应的动画效果 //如无相对应的,则发出警告 if(hButton=GetDlgItem(hwnd,wParam)) { SendMessage(hButton,BM_SETSTATE,1,0); Sleep(100); SendMessage(hButton,BM_SETSTATE,0,0); } else { MessageBeep(0); break; } //上面的键盘按键会把hwnd传递到下面 //下面就是鼠标点击的实现了 case WM_COMMAND: //设置焦点 SetFocus(hwnd); //BACK的处理 if(LOWORD(wParam)==VK_BACK) //十六进制的,就要除以16 ShowNumber(hwnd,iNumber/=16); //Equals的处理 else if(LOWORD(wParam)==VK_ESCAPE) ShowNumber(hwnd,iNumber=0); //判断是不是数字 else if(isxdigit(LOWORD(wParam))) { //判断是第几个数字 if(bNewNumber) { iFirstNum=iNumber; iNumber=0; } bNewNumber=FALSE; //只做4位的处理? if(iNumber<=MAXDWORD>>4) ShowNumber(hwnd,iNumber=16*iNumber+wParam-(isdigit(wParam)? '0':'A'-10)); else MessageBeep(0); } else { //输入的是第二个数字,就调用CalcIt来计算 //不是的话,下面就是设置标志位,读入操作符 if(!bNewNumber) ShowNumber(hwnd,iNumber=CalcIt(iFirstNum,iOperation,iNumber)); bNewNumber=TRUE; iOperation=LOWORD(wParam); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }
第一次直接在WinMain中调用对话框,这种方式以后应该会经常用到的,处理方式会在以后经常用到。
完成了这个了,今天其它事情就是做个小程序,测试一下昨天到的三个摄像头能否同时工作,图像处理啊~~~~。
最近学了Windows程序了,直接用Windows API来实现,不再用那繁琐的MFC了,还是喜欢自己能把控的代码。