《Windows程式設計》之POPUP2

來源:互聯網
上載者:User
#include <Windows.h>#include "RESOURCE.H"#define ID_EDIT 1LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);TCHAR szAppName[]=TEXT("PopPad2");int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){HACCEL hAccel;HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style=CS_VREDRAW|CS_HREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.hInstance=hInstance;//第一個參數不能是NULL,否則會出一些意想不到結果wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.lpszClassName=szAppName;//這個地方也不可以是NULL,不然不會有上面的菜單wndclass.lpszMenuName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);return 0;}//置中,大小為螢幕一半hwnd=CreateWindow(szAppName,szAppName,WS_OVERLAPPEDWINDOW,GetSystemMetrics(SM_CXSCREEN)/4,GetSystemMetrics(SM_CYSCREEN)/4,GetSystemMetrics(SM_CXSCREEN)/2,GetSystemMetrics(SM_CYSCREEN)/2,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);//調入加速鍵表hAccel=LoadAccelerators(hInstance,szAppName);while(GetMessage(&msg,NULL,0,0)){/*TranslateAccelerator函數確定儲存在msg訊息結構體中的訊息是否是鍵盤訊息。如果是,該函數在加速鍵表中尋找控制代碼為hAccel的匹配值。如果找到匹配值,它會調用控制代碼為hwnd的視窗過程,就是AskConfirmation(HWND hwnd)。如果鍵盤加速鍵ID對應系統功能表的一個功能表項目,則相應訊息為WM_SYSCOMMAND;否則為WM_COMMAND。當TranslateAccelerator返回時,如果訊息被翻譯過(並且已被發送給視窗過程),則傳回值為非零值,否則返回零*/if(!TranslateAccelerator(hwnd,hAccel,&msg)){TranslateMessage(&msg);DispatchMessage(&msg);}}return msg.wParam;}int AskConfirmation(HWND hwnd){return MessageBox(hwnd,TEXT("Really want to close PopPad2"),szAppName,MB_YESNO|MB_ICONQUESTION);}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static HWND hwndEdit;int iSelect,iEnable;switch(message){case WM_CREATE:/*WS_CHILD子視窗;WS_VISIBLE顯示;WS_HSCROLL、WS_VSCROLL兩個捲軸;WS_BORDER有邊界;ES_LEFT靠左對齊;ES_MULILINE多行ES_AUTOHSCROLL、ES_AUTOVSCROLL自動捲軸*/hwndEdit=CreateWindow(TEXT("edit"),NULL,WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|WS_BORDER|ES_LEFT|ES_MULTILINE|ES_AUTOHSCROLL|ES_AUTOVSCROLL,0,0,0,0,hwnd,(HMENU)ID_EDIT,((LPCREATESTRUCT)lParam)->hInstance,NULL);return 0;case WM_SETFOCUS://設定文字框有交點SetFocus(hwndEdit);return 0;case WM_SIZE://設定大小MoveWindow(hwndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);return 0;//應該是當下拉式功能表變為active前(可以理解為是彈出前)觸發。case WM_INITMENUPOPUP://按本書意思應該是說,當菜單Edit要顯示時,lParam為1if(lParam==1){//SendMessage確定傳回值是否能夠撤銷,可以的話,就返回TRUEEnableMenuItem((HMENU)wParam,IDM_EDIT_UNDO,SendMessage(hwndEdit,EM_CANUNDO,0,0)?MF_ENABLED:MF_GRAYED);//IsClipboardFormatAvailable判斷剪貼版中是否有相應的資料,有則返回非0EnableMenuItem((HMENU)wParam,IDM_EDIT_PASTE,IsClipboardFormatAvailable(CF_TEXT)?MF_ENABLED:MF_GRAYED);//擷取選定的iSelect=SendMessage(hwndEdit,EM_GETSEL,0,0);//iSelect的低位是第一個被選中的位置,高位字是緊隨選中文本後面的第一個字元的位置,如果相等,表明沒有文本被選中//這個地方第一次接觸if(HIWORD(iSelect==LOWORD(iSelect)))iEnable=MF_GRAYED;elseiEnable=MF_ENABLED;EnableMenuItem((HMENU)wParam,IDM_EDIT_CUT,iEnable);EnableMenuItem((HMENU)wParam,IDM_EDIT_COPY,iEnable);EnableMenuItem((HMENU)wParam,IDM_EDIT_CLEAR,iEnable);return 0;}break;case WM_COMMAND://判斷這個WM_COMMAND訊息是由哪個地方產生的,菜單的話,lParam為0;//子視窗,按鍵為1if(lParam){//字元數量太多,超出範圍if(LOWORD(wParam)==ID_EDIT&&(HIWORD(wParam==EN_ERRSPACE)))MessageBox(hwnd,TEXT("Edit control out of space."),szAppName,MB_OK|MB_ICONSTOP);return 0;}else switch(LOWORD(wParam)){case IDM_FILE_NEW:case IDM_FILE_OPEN:case IDM_FILE_SAVE:case IDM_FILE_SAVE_AS:case IDM_FILE_PRINT:MessageBeep(0);return 0;case IDM_APP_EXIT:SendMessage(hwnd,WM_CLOSE,0,0);return 0;case IDM_EDIT_UNDO:SendMessage(hwndEdit,WM_UNDO,0,0);return 0;case IDM_EDIT_CUT:SendMessage(hwndEdit,WM_CUT,0,0);return 0;case IDM_EDIT_COPY:SendMessage(hwndEdit,WM_COPY,0,0);return 0;case IDM_EDIT_PASTE:SendMessage(hwndEdit,WM_PASTE,0,0);return 0;case IDM_EDIT_CLEAR:SendMessage(hwndEdit,WM_CLEAR,0,0);return 0;case IDM_EDIT_SELECT_ALL:SendMessage(hwndEdit,EM_SETSEL,0,-1);return 0;case IDM_HELP_HELP:MessageBox(hwnd,TEXT("Help not yet implemented!"),szAppName,MB_OK|MB_ICONEXCLAMATION);return 0;case IDM_APP_ABOUT:MessageBox(hwnd,TEXT("POPPAD2 (c) Charles Petzold,2012"),szAppName,MB_OK|MB_ICONINFORMATION);return 0;}break;case WM_CLOSE:if(IDYES==AskConfirmation(hwnd))DestroyWindow(hwnd);return 0;case WM_QUERYENDSESSION:if(IDYES==AskConfirmation(hwnd))return 1;elsereturn 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}


這次代碼是所有的代碼,留給自己以後看吧,裡面一些東西,很有用的。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.