《Windows程式設計》之對話方塊

來源:互聯網
上載者:User
///////////////////////////////////////////////////////////////////////////《Windows程式設計》第11章對話方塊代碼ABOUT2/////////////////////////////////////////////////////////////////////////#include <Windows.h>#include "RESOURCE.H"LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);BOOL CALLBACK AboutDlgProc(HWND,UINT,WPARAM,LPARAM);int iCurrentColor=IDC_BLACK,iCurrentFigure=IDC_RECT;int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){static TCHAR szAppName[]=TEXT("About2");MSG msg;HWND hwnd;WNDCLASS wndclass;wndclass.style=CS_VREDRAW|CS_HREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(hInstance,szAppName);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszClassName=szAppName;wndclass.lpszMenuName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR);return 0;}hwnd=CreateWindow(szAppName,TEXT("About Box Demo Program"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,iCmdShow);UpdateWindow(hwnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}return msg.wParam;}void PaintWindow(HWND hwnd,int iColor,int iFigure){static COLORREF crColor[8]={RGB(0,0,0),RGB(0,0,255),RGB(0,255,0),RGB(0,255,255),RGB(255,0,0),RGB(255,0,255),RGB(255,255,0),RGB(255,255,255)};HBRUSH hBrush;HDC hdc;RECT rect;hdc=GetDC(hwnd);GetClientRect(hwnd,&rect);hBrush=CreateSolidBrush(crColor[iColor-IDC_BLACK]);hBrush=(HBRUSH)SelectObject(hdc,hBrush);if(iFigure==IDC_RECT)Rectangle(hdc,rect.left,rect.top,rect.right,rect.bottom);elseEllipse(hdc,rect.left,rect.top,rect.right,rect.bottom);DeleteObject(SelectObject(hdc,hBrush));ReleaseDC(hwnd,hdc);}//對下面這個函數不理解,常規想法應該是PaintWindow後再UpdateWindow,但事實這樣不可以,系統會卡住void PaintTheBlock(HWND hCtrl,int iColor,int iFigure){//使子視窗控制項無效InvalidateRect(hCtrl,NULL,TRUE);//如果視窗更新的地區不為空白,UpdateWindow函數通過發送一個WM_PAINT訊息來更新指定視窗的客戶區。//函數繞過應用程式的訊息佇列,直接發送WM_PAINT訊息給指定視窗的視窗過程,如果更新地區為空白,則不發送訊息。//對此UpdateWindow還不是不懂UpdateWindow(hCtrl);PaintWindow(hCtrl,iColor,iFigure);}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static HINSTANCE hInstance;PAINTSTRUCT ps;switch(message){case WM_CREATE://擷取控制代碼,在下面要使用hInstance=((LPCREATESTRUCT)lParam)->hInstance;return 0;case WM_COMMAND:switch(LOWORD(wParam)){case IDM_APP_ABOUT://根據對話方塊模板資源建立一個模態的對話方塊//這邊是回調完成後才觸發的//直到指定的回呼函數通過調用EndDialog函數中止模態的對話方塊才能返回控制。//調用失敗,返回-1//調用成功,返回EndDialog中的參數if(DialogBox(hInstance,TEXT("AboutBox"),hwnd,AboutDlgProc))//重新整理視窗InvalidateRect(hwnd,NULL,TRUE);return 0;}break;case WM_PAINT://這兩行代碼不清楚是怎麼回事,但是去掉後,程式不能執行                //使先前的無效地區有效                BeginPaint(hwnd,&ps);EndPaint(hwnd,&ps);//畫矩形或者是圓PaintWindow(hwnd,iCurrentColor,iCurrentFigure);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){static HWND hCtrlBlock;static int iColor,iFigure;switch(message){//初始化case WM_INITDIALOG:iColor=iCurrentColor;iFigure=iCurrentFigure;//每組中指定選定一個,控制代碼,開始,結束,選中項CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE,iColor);CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,iFigure);//擷取設定面板中展示區控制項的控制代碼hCtrlBlock=GetDlgItem(hDlg,IDC_PAINT);//設定焦點SetFocus(GetDlgItem(hDlg,iColor));//這個返回TRUE跟FALSE,好像對結果沒啥影響,不知其原因return FALSE;case WM_COMMAND://LOWORD(wParam)是指明哪個控制項switch(LOWORD(wParam)){case IDOK:iCurrentColor=iColor;iCurrentFigure=iFigure;//這個返回關係著DialogBox的返回EndDialog(hDlg,TRUE);return TRUE;case IDCANCEL:EndDialog(hDlg,FALSE);return TRUE;case IDC_BLACK:case IDC_RED:case IDC_GREEN:case IDC_YELLOW:case IDC_BLUE:case IDC_MAGENTA:case IDC_CYAN:case IDC_WHITE://設定顏色,用於畫圖iColor=LOWORD(wParam);//設定按鍵,用於顯示CheckRadioButton(hDlg,IDC_BLACK,IDC_WHITE,LOWORD(wParam));//小視窗區的時時更新PaintTheBlock(hCtrlBlock,iColor,iFigure);return TRUE;case IDC_RECT:case IDC_ELLIPSE:iFigure=LOWORD(wParam);CheckRadioButton(hDlg,IDC_RECT,IDC_ELLIPSE,LOWORD(wParam));PaintTheBlock(hCtrlBlock,iColor,iFigure);return TRUE;}break;case WM_PAINT:PaintTheBlock(hCtrlBlock,iColor,iFigure);break;}return FALSE;}///////////////////////////////////////////////////////////////////////////在一開始產生子視窗時,調用過程如下://PaintTheBlock----------->UpdateWindow-------->PaintWindow//在切換顏色與形狀時,調用過程如下://UpdateWindow--------->PaintWindow//UpdateWindow到底做了什嗎?不是說會調用WM_PAINT麼,但是我設定斷點卻沒有/////////////////////////////////////////////////////////////////////////

看了幾個文章,好像大體理解了這個問題。

1、PaintTheBlock中傳入的第一個參數並不是子視窗的,而是子視窗中一個Text控制項的(用來畫圖的)。

2、調用InvalidateRect是來設定這個子視窗控制項的地區無效

3、調用UpdateWindow是用來觸發WM_PAINT,這個WM_PAINT是這個子視窗控制項的WM_PAINT,而不是子視窗的。

4、上面兩句代碼的意思應該就是想清除這個文本控制項的特徵吧,然後直接來畫圖。

不知道這麼理解對不對,還希望各位多多提意見

相關文章

聯繫我們

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