#include <Windows.h> LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); BOOL CALLBACK ColorScrDlg(HWND,UINT,WPARAM,LPARAM); HWND hDlgModeless; int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow) { static TCHAR szAppName[]=TEXT("Color2"); MSG msg; HWND hwnd; WNDCLASS wndclass; wndclass.style=CS_VREDRAW|CS_HREDRAW; wndclass.lpfnWndProc=WndProc; wndclass.cbClsExtra=0; wndclass.cbWndExtra=0; wndclass.hbrBackground=CreateSolidBrush(0L); wndclass.hInstance=hInstance; wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); wndclass.lpszMenuName=NULL; wndclass.lpszClassName=szAppName; if(!RegisterClass(&wndclass)) { MessageBox(NULL,TEXT("This program requires Windows NT!"),szAppName,MB_ICONERROR); return 0; } //WS_CLIPCHILDREN作用在不擦出对话框的前提下重绘方窗口 hwnd=CreateWindow(szAppName,TEXT("Color Scroll"),WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN,CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,iCmdShow); UpdateWindow(hwnd); hDlgModeless=CreateDialog(hInstance,TEXT("ColorScrDlg"),hwnd,ColorScrDlg); while(GetMessage(&msg,NULL,0,0)) { //这个地方来判断消息循环是不是对话框的 if(hDlgModeless==0||!IsDialogMessage(hDlgModeless,&msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_DESTROY: //关闭前先把类的背景刷子给换掉,删掉新建的 DeleteObject((HGDIOBJ)SetClassLong(hwnd,GCL_HBRBACKGROUND,(LONG)GetStockObject(WHITE_BRUSH))); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); } BOOL CALLBACK ColorScrDlg(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam) { static int iColor[3]; HWND hwndParent,hCtrl; int iCtrlID,iIndex; switch(message) { case WM_INITDIALOG: for(iCtrlID=10;iCtrlID<13;iCtrlID++) { //iCtrlID与资源中的是相对应的 //获取句柄 hCtrl=GetDlgItem(hDlg,iCtrlID); //设置范围 SetScrollRange(hCtrl,SB_CTL,0,255,FALSE); //设置起始点 SetScrollPos(hCtrl,SB_CTL,0,FALSE); } return TRUE; case WM_VSCROLL: //lParam传递进来的是句柄 hCtrl=(HWND)lParam; //获取ID号,这里的hCtrl是窗口上三个滚动条 iCtrlID=GetWindowLong(hCtrl,GWL_ID); iIndex=iCtrlID-10; //hwndParent是显示颜色变化的那个窗口句柄 hwndParent=GetParent(hDlg); //wParam低位是控制 switch(LOWORD(wParam)) { //这个case语句后没有break,直接触发SB_LINEDOWN来再向下移动1, //并且判断是否是最低了 case SB_PAGEDOWN: iColor[iIndex]+=15; //鼠标点击滚动条向下的按钮 case SB_LINEDOWN: iColor[iIndex]=min(255,iColor[iIndex]+1); break; case SB_PAGEUP: iColor[iIndex]-=15; case SB_LINEUP: iColor[iIndex]=max(0,iColor[iIndex]-1); break; case SB_TOP: iColor[iIndex]=0; break; case SB_BOTTOM: iColor[iIndex]=255; break; case SB_THUMBPOSITION: case SB_THUMBTRACK: //wParam高位鼠标点击的位置 iColor[iIndex]=HIWORD(wParam); break; default: return FALSE; } SetScrollPos(hCtrl,SB_CTL,iColor[iIndex],TRUE); //设置相应的每个滚动条下面的数字 SetDlgItemInt(hDlg,iCtrlID+3,iColor[iIndex],FALSE); //替换与类有关的背景的刷子,删除返回的刷子句柄 DeleteObject((HGDIOBJ)SetClassLong(hwndParent,GCL_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(iColor[0],iColor[1],iColor[2])))); //重绘 InvalidateRect(hwndParent,NULL,TRUE); return TRUE; } return FALSE; }