《Windows程式設計》之子視窗

來源:互聯網
上載者:User
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static COLORREF crPrim[3]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};static HBRUSH hBrush[3],hBrushStatic;static HWND hwndScroll[3],hwndLabel[3],hwndValue[3],hwndRect;static int color[3],cyChar;static RECT rcColor;static TCHAR * szColorLabel[]={TEXT("Red"),TEXT("Green"),TEXT("Blue")};HINSTANCE hInstance;int i,cxClient,cyClient;TCHAR szBuffer[10];switch(message){case WM_CREATE://擷取控制代碼hInstance=(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);//建立一個靜態矩形hwndRect=CreateWindow(TEXT("static"),NULL,WS_CHILD|WS_VISIBLE|SS_WHITERECT,0,0,0,0,hwnd,(HMENU)9,hInstance,NULL);//建立三個捲軸控制項for(i=0;i<3;i++){//建立,注意WS_TABTOP,這個加上後,可以使用tab;SBS_VERT是縱向滾動hwndScroll[i]=CreateWindow(TEXT("scrollbar"),NULL,WS_CHILD|WS_VISIBLE|WS_TABSTOP|SBS_VERT,0,0,0,0,hwnd,(HMENU)i,hInstance,NULL);//設定   捲軸控制項  的範圍,FALSE表示不重繪SetScrollRange(hwndScroll[i],SB_CTL,0,255,FALSE);//設定初始位置SetScrollPos(hwndScroll[i],SB_CTL,0,FALSE);//建立捲軸上方靜態文字框,設定的(HMENU)為唯一id,後面經常用過hwndLabel[i]=CreateWindow(TEXT("static"),szColorLabel[i],WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+3),hInstance,NULL);//建立捲軸下方顯示數值的文字框hwndValue[i]=CreateWindow(TEXT("static"),TEXT("0"),WS_CHILD|WS_VISIBLE|SS_CENTER,0,0,0,0,hwnd,(HMENU)(i+6),hInstance,NULL);//這個地方應該是調用了回呼函數//GWL_WNDPROC:獲得視窗過程的地址,或代表視窗過程的地址的控制代碼。必須使用CallWindowProc函數調用視窗過程。 //暫時不清楚設定傳回值有什麼用OldScroll[i]=(WNDPROC)SetWindowLong(hwndScroll[i],GWL_WNDPROC,(LONG)ScrollProc);//建立三個具有指定顏色的邏輯刷子hBrush[i]=CreateSolidBrush(crPrim[i]);}hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));//系統字型的高度cyChar=HIWORD(GetDialogBaseUnits());return 0;case WM_SIZE://客戶區長寬cxClient=LOWORD(lParam);cyClient=HIWORD(lParam);//設定矩形內容,在此是設定顏色SetRect(&rcColor,cxClient/2,0,cxClient,cyClient);//這個設定左側放9個子視窗的地區的大小跟位置MoveWindow(hwndRect,0,0,cxClient/2,cyClient,TRUE);//設定大小,位置for(i=0;i<3;i++){MoveWindow(hwndScroll[i],(2*i+1)*cxClient/14,2*cyChar,cxClient/14,cyClient-4*cyChar,TRUE);MoveWindow(hwndLabel[i],(4*i+1)*cxClient/28,cyChar/2,cxClient/7,cyChar,TRUE);MoveWindow(hwndValue[i],(4*i+1)*cxClient/28,cyClient-3*cyChar/2,cxClient/7,cyChar,TRUE);}//把焦點設定到父視窗SetFocus(hwnd);return 0;case WM_SETFOCUS://設定焦點SetFocus(hwndScroll[idFocus]);return 0;case WM_VSCROLL://擷取idi=GetWindowLong((HWND)lParam,GWL_ID);//判斷按鍵switch(LOWORD(wParam)){                   //省略了一些}//設定位置SetScrollPos(hwndScroll[i],SB_CTL,color[i],TRUE);wsprintf(szBuffer,TEXT("%i"),color[i]);//設定捲軸下方的數字SetWindowText(hwndValue[i],szBuffer);//GCL_HBRBACKGROUND:替換與類有關的背景刷子的控制代碼。DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(color[0],color[1],color[2]))));//重繪地區,TRUE表示重繪前先清除背景InvalidateRect(hwnd,&rcColor,TRUE);return 0;//當某個小視窗要重繪時,返回相應的刷子case WM_CTLCOLORSCROLLBAR:i=GetWindowLong((HWND)lParam,GWL_ID);return (LRESULT)hBrush[i];//靜態文本重繪時,返回相應的刷子case WM_CTLCOLORSTATIC:i=GetWindowLong((HWND)lParam,GWL_ID);if(i>=3&&i<=8){SetTextColor((HDC)wParam,crPrim[i%3]);SetBkColor((HDC)wParam,GetSysColor(COLOR_BTNHIGHLIGHT));return (LRESULT)hBrushStatic;}break;//系統色彩更改時,重新建立hBrushStaticcase WM_SYSCOLORCHANGE:DeleteObject(hBrushStatic);hBrushStatic=CreateSolidBrush(GetSysColor(COLOR_BTNHIGHLIGHT));return 0;//清理的一些工作case WM_DESTROY:DeleteObject((HBRUSH)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH)));for(i=0;i<3;i++)DeleteObject(hBrush[i]);DeleteObject(hBrushStatic);PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}LRESULT CALLBACK ScrollProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){int id=GetWindowLong(hwnd,GWL_ID);switch(message){//按鍵動作case WM_KEYDOWN://實現tab的功能if(wParam==VK_TAB)SetFocus(GetDlgItem(GetParent(hwnd),(id+(GetKeyState(VK_SHIFT)<0?2:1))%3));break;case WM_SETFOCUS:idFocus=id;break;}return CallWindowProc(OldScroll[id],hwnd,message,wParam,lParam);}

裡面有很多東西值得學習,捲軸控制項的使用,按鈕訊息與父視窗的訊息傳遞,id的擷取,按鈕顏色等的設定,整個的排版等,好多好多。

代碼是COLORS1的部分,走了,回宿舍,不然就被關外面了。

相關文章

聯繫我們

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