Windows学习心得【子窗口】

来源:互联网 发布:java项目打包成war 编辑:程序博客网 时间:2024/06/07 13:05
#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 szCmdShow,//指向应用程序命令行的字符串的指针    int iCmdShow)//指明窗口如何显示{static TCHAR szAppName[]=TEXT("Checker3");//窗口类名HWND hwnd;//句柄MSG msg;//消息WNDCLASS wndclass;//定义类wndclass.style=CS_HREDRAW | CS_VREDRAW;//设置窗口的显示方式,这里为水平重画和竖直重画wndclass.cbClsExtra=0;//窗口扩展,此处为0wndclass.cbWndExtra=0;//窗口实例扩展,此处为0wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//设置窗口的背景颜色,在此为白色画刷wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置鼠标的显示方式,此处为标准型wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗口的显示方式,此处为应用程序类wndclass.hInstance=hInstance;//窗口的实例句柄wndclass.lpfnWndProc=WndProc;//窗口的回调函数wndclass.lpszClassName=szAppName;//类名wndclass.lpszMenuName=NULL;//菜单名,此处为NULL//注册窗口,若注册失败,显示如下信息if(!RegisterClass(&wndclass)){MessageBox(NULL,TEXT("Program requires Windows NT!"),szAppName,MB_ICONERROR);return 0;}//一下为窗口内的子窗口的设置参数wndclass.lpfnWndProc=ChildWndProc;//窗口过程的回调函数wndclass.cbWndExtra=sizeof(long);//窗口类的实例扩展,此处设置为一个长整型的变量,为窗口预留空间wndclass.hIcon=NULL;//窗口类的显示方式wndclass.lpszClassName=szChildClass;//类名//注册窗口RegisterClass(&wndclass);//获取句柄hwnd=CreateWindow(szAppName,//类名TEXT("Checker3 Mouse Hit-Test Demo"),//窗口的名字WS_OVERLAPPEDWINDOW,//窗口的风格CW_USEDEFAULT,//指定窗口的初始水平位置,如果该参数被设为CW_USEDEFAULT则系统为窗口选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT,//指定窗口的初始垂直位置 CW_USEDEFAULT,//以设备单元指明窗口的宽度。若是CW_USEDEFAULT,则系统为窗口选择一个缺省的宽度CW_USEDEFAULT,//以设备单元指明窗口的高度。若被设为CW_USEDEFAULT,则系统忽略nHeight参数。NULL,//指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL  NULL,//菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL hInstance,//与窗口相关联的模块实例的句柄。 NULL);//指向一个值的指针,该值传递给窗口WM_CREATE消息  ShowWindow(hwnd,iCmdShow);//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示。UpdateWindow(hwnd);//更新窗口,hWnd:指窗口句柄。while(GetMessage(&msg,NULL,0,0))//消息循环{TranslateMessage(&msg);//该函数将虚拟键消息转换为字符消息   DispatchMessage(&msg);//该函数分发一个消息给窗口程序。}return msg.wParam;//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循环依次为25个窗口获取句柄{for(y=0;y<DIVISIONS;y++){hwndChild[x][y]=CreateWindow(szChildClass,NULL,//窗口的名字,此处无WS_CHILDWINDOW | WS_VISIBLE,//创建一个子窗口,并且创建一个初始状态为可见的窗口0,0,0,0,hwnd,//指向被创建窗口的父类或所有窗口的句柄//对于主窗口来说,没有菜单因此此处为NULL//但对于子窗口来说,该参数成为“子ID”,这是一个唯一标识子窗口的数值//y << 8 | x是为了区分各个子窗口,使它们分别有自己独特的ID(HMENU)(y<<8|x),//CreateWindow函数需要一个实例句柄//但是在创建子窗口时必须调用GetWindowLong函数获取hInstance值(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE),NULL);}}return 0;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,//左顶点的x坐标y*cyBlock,//左顶点的y坐标cxBlock,//宽度cyBlock,//高度TRUE);//是否重画,如果为TRUE,则像通常那样在消息处理函数中接收到一条WM_PAINT消息。}return 0;case WM_LBUTTONDOWN:MessageBeep(0);return 0;case WM_DESTROY://关闭窗口PostQuitMessage(0);//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。 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);//如果函数成功,返回值是指定的32位整数的原来的值。如果函数失败,返回值为0。return 0;case WM_LBUTTONDOWN://GetWindowLong如果函数成功,返回值是所需的32位值;如果函数失败,返回值是0。//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);}

0 0
原创粉丝点击