7d 同样实现7b功能 但是采用25个子窗口实现

来源:互联网 发布:软件项目进度计划 编辑:程序博客网 时间:2024/05/09 10:08

同样实现7b功能 但是采用25个子窗口实现

#include<Windows.h>#define DIVISIONS 5LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);LRESULT CALLBACK ChildWndProc(HWND,UINT,WPARAM,LPARAM);TCHAR szChildClass[]=TEXT("Checker3_child");int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow){static TCHAR szAppName[]=TEXT("Checker3");HWND hwnd;MSG msg;WNDCLASS wndclass;wndclass.style=CS_HREDRAW | CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=szAppName;if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("Program requires Windows NT !"),szAppName,MB_ICONERROR);return 0;}wndclass.lpfnWndProc=ChildWndProc;wndclass.cbWndExtra=sizeof(long);/*cbWndExtra 栏位设定为 4 位元组, 或者更确切地用 sizeof (long) 。 该栏位告诉 Windows 在其为依据此视窗类别的视窗保留的内部结构中, 预留了 4 位元组额外的空间。 您能使用此空间来保存每个视窗的可能有所不同的资讯。*/wndclass.hIcon=NULL;wndclass.lpszClassName=szChildClass;/*typedef struct _WNDCLASS {UINT style;// 窗口类型WNDPROC lpfnWndProc;//窗口处理函数int cbClsExtra;//窗口扩展int cbWndExtra;//窗口实例扩展HINSTANCE hInstance;//实例句柄HICON hIcon;//窗口的最小化图标HCURSOR hCursor;//窗口鼠标光标HBRUSH hbrBackground;//窗口背景色LPCTSTR lpszMenuName;//窗口菜单LPCTSTR lpszClassName;// 窗口类名} WNDCLASS, *LPWNDCLASS;*/RegisterClass(&wndclass);hwnd=CreateWindow(szAppName,TEXT("Checker3 Mouse Hit-Test Demo"),WS_OVERLAPPEDWINDOW,//也就是说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;}LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static HWND hwndChild[DIVISIONS][DIVISIONS];int cxBlock,cyBlock,x,y;switch(message){case WM_CREATE:for(x=0;x<DIVISIONS;x++)for(y=0;y<DIVISIONS;y++)hwndChild[x][y]=CreateWindow(szChildClass,NULL,WS_CHILDWINDOW|WS_VISIBLE,0,0,0,0,hwnd,(HMENU)(y<<8 | x),///////////////////////??(HINSTANCE )GetWindowLong(hwnd,GWL_HINSTANCE),NULL);//GWL_HINSTANCE (-6)  获得应用实例的句柄。return 0;/*hMenu菜单句柄,或依据窗口风格指明一个子窗口标识。对于层叠或弹出式窗口,hMenu指定窗口使用的菜单:如果使用了菜单类,则hMenu可以为NULL。对于子窗口,hMenu指定了该子窗口标识(一个整型量),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗口标识,这个值对于相同父窗口的所有子窗口必须是唯一的。*//*HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hlnstance,LPVOID lpParam);*/case WM_SIZE:cxBlock=LOWORD(lParam)/DIVISIONS;cyBlock=HIWORD(lParam)/DIVISIONS;for(x=0;x<DIVISIONS;x++)for(y=0;y<DIVISIONS;y++)MoveWindow(hwndChild[x][y],x*cxBlock,y*cyBlock,cxBlock,cyBlock,TRUE);return 0;case WM_LBUTTONDOWN:MessageBeep(0);return 0;case WM_DESTROY:PostQuitMessage(0);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}LRESULT CALLBACK ChildWndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){HDC hdc;PAINTSTRUCT ps;RECT rect;switch(message){case WM_CREATE:SetWindowLong(hwnd,0,0);///// 设置初始为0 表示未选中return 0;case WM_LBUTTONDOWN:SetWindowLong(hwnd,0,1^GetWindowLong(hwnd,0));///表示单击区域 选中变为不选中 不选中变为选中InvalidateRect(hwnd,NULL,FALSE);return 0;case WM_PAINT://画一个矩形hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);Rectangle(hdc,0,0,rect.right,rect.bottom);if(GetWindowLong(hwnd,0))/////?{//画×MoveToEx (hdc, 0,  0, NULL) ;LineTo (hdc, rect.right, rect.bottom) ;MoveToEx (hdc, 0,  rect.bottom, NULL) ;LineTo (hdc, rect.right, 0) ;}EndPaint(hwnd,&ps);return 0;}return DefWindowProc(hwnd,message,wParam,lParam);}


效果同7b相同

0 0