《Windows程式設計》之HEXCALC

來源:互聯網
上載者:User
#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)//十六進位的,就要除以16ShowNumber(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));elseMessageBeep(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了,還是喜歡自己能把控的代碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.