《Windows程序设计》之POPUP2

来源:互联网 发布:java seversocket 编辑:程序博客网 时间:2024/06/07 17:20
#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);}

这次代码是所有的代码,留给自己以后看吧,里面一些东西,很有用的。