我是靠谱客的博主 漂亮手机,最近开发中收集的这篇文章主要介绍mysql怎么创建窗口应用程序,Win32子窗口及其创建应用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介:

所谓的子窗口就是一个父窗口里的一个窗口,父窗口也叫主窗口。子窗口也是窗口,它有自己的回调函数、自己的窗口类、自己的创建。它位于主窗口里的一个区域,我们可以设置子窗口的大小和位置以及相关属性。子窗口与主窗口之间是相联系的,它们通过句柄和消息等访问彼此的。

特别提醒:

后面所讲的子窗口控件是一种特殊的子窗口。子窗口控件不需要我们来定义窗口类,系统已经帮我们定义好了,我们自己引用就好。

这里我们先介绍普通子窗口。

一、子窗口的创建

创建过程:

1.注册窗口类(我们在主窗口注册后面接着注册子窗口)

2.创建子窗口(一般在WS_CREATE消息处理中创建,和创建主窗口一样使用CreateWindow函数,参数不同哦,需加上WS_CHILD和WS_VISIBLE风格)

3.定义子窗口的回调函数(子窗口回调函数和主窗口回调函数大致一样,改下函数名)

1.注册窗口类

子窗口类参数基本和主窗口一样,一般只需修改一下四个参数即可。

// 注册主窗口后面,修改四个参数

wc.cbClsExtra = sizeof(long); // 预留空间

wc.hIcon = NULL; // 图标设为空

wc.lpfnWndProc = ChildWndProc; // 回调函数

wc.lpszClassName = TEXT("ChildWindow"); // 子窗口类名

// 注册子窗口类

RegisterClassEx(&wc);

2.创建子窗口

CreateWindow参数的比较:

参数

主窗口

子窗口

窗口类名

自己定义

自己定义

窗口标题

自己定义

NULL

窗口样式

WS_OVERLAPPEDWINDOW

WS_CHILDWINDOW 和 WS_VISIBLE

水平位置

CW_USEDEFAULT

0(后面可通过MoveWindow函数修改)

垂直位置

CW_USEDEFAULT

0(后面可通过MoveWindow函数修改)

宽度

CW_USEDEFAULT

0(后面可通过MoveWindow函数修改)

高度

CW_USEDEFAULT

0(后面可通过MoveWindow函数修改)

父窗口句柄

NULL

hwnd

菜单句柄/子ID

NULL

(HMENU) (y << 8 |x) 不同子ID就行

实体句柄

hInstance

(HINSTANCE)GetWindowLong (hwnd, GWL_HINSTANCE)或(LPCREATESTRUCT)lParam->hInstance

额外参数lParam

NULL

NULL

子窗口是否显示可调用ShowWindow函数进行修改,窗口的大小、位置可以通过MoveWindow函数进行修改。

// 创建25个子窗口

case WM_CREATE:

{

for (i = 0; i < 5; i++)

{

for (j = 0; j < 5; j++)

{

childhwnd[i][j]=CreateWindow(TEXT("ChildWindow"), NULL,

WS_CHILD|WS_VISIBLE,

0, 0, 0 ,0,

hwnd, (HMENU)(x++),

(HINSTANCE)GetWindowLong (hwnd, GWL_HINSTANCE), NULL);

}

}

break;

}

3.定义子窗口回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); // 主窗口回调函数

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); // 子窗口回调函数

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)

{

switch(Message)

{

case WM_LBUTTONDOWN:

{

ShowWindow(hwnd, SW_HIDE);

break;

}

default:

return DefWindowProc(hwnd, Message, wParam, lParam); //让系统处理消息,这条语句一定要加上

}

return 0;

}

二、子窗口与主窗口的联系

1.主窗口访问子窗口(发送消息)

GetWindowLongPrt函数:获取窗口信息

LONG_PTR GetWindowLongPtr(HWND hWnd, // 窗口句柄

int nIndex); // 获取的信息指定值

参数

含义

GWL_EXSTYLE

获取扩展窗口样式。更多信息,查阅CreateWindowEx.

GWL_STYLE

获取窗口样式(window styles)

GWLP_WNDPROC

获取窗口程序指示器,或描述指示器的句柄 。如果使用此参数,必须使用CallWindowProc回调函数。

GWLP_HINSTANCE

获取一个应用程序实例的句柄 。

GWLP_HWNDPARENT

如果只有一个父窗口,获取父窗口的句柄 。

GWLP_ID

获取窗口标识符。

GWLP_USERDATA

获取窗口关联的数据,是应用程序创建窗口时留给用户的数据。初始值是0。

DWLP_DLGPROC

获取一个对话框的指示器,或描述指示器的句柄 。如果使用此参数,必须使用CallWindowProc回调函数。

DWLP_MSGRESULT

获取一个对话框中的被处理的信息的值。

DWLP_USER

作为指示器或句柄来获取私有应用程序的额外的信息。

GetDlgCtrlID函数:获取指定控件的ID号

ID是针对子窗体而言的,窗体时把这个ID号传递给hMenu参数。

int GetDlgCtrlID(HWND hwndCtl); // 子窗口句柄

GetDlgItem函数:获取指定ID的句柄

HWND childhwnd = GetDlgItem(Parenthwnd,ID);

MoveWindow函数:改变指定窗口的位置和大小

对基窗口来说,位置和大小取决于屏幕的左上角;对子窗口来说,位置和大小取决于父窗口客户区的左上角.对于Owned窗口,位置和大小取决于屏幕左上角.

BOOL MoveWindow( HWND hWnd, int X, int Y, int nWidth, int nHeight,

BOOL bRepaint ); // TRUE重画,FALSE不重画

SendMessage函数:将指定的消息发送到一个或多个窗口

SendMessage函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。

PostMessage函数是将一个消息寄送到一个线程的消息队列后就立即返回。

LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam)

2.子窗口访问主窗口(发送消息)

获得一个指定子窗口的父窗口句柄:GetParent

将指定的消息发送到一个或多个窗口:SendMessage

HWND GetParent(HWND hWnd);

三、子窗口的应用:翻牌

简介:

这里创建了25个子窗口,开始设置25个子窗口都可见,后面主窗口和子窗口分别相应鼠标左键按下的消息,主窗口收到消息显示子窗口,子窗口收到消息隐藏子窗口,ShowWindow可以实现。子窗口显示时就看不到图片,子窗口不显示能看到图片。子窗口隐藏状态时,子窗口就消失了,不能接受鼠标按下消息了。这里需要注意的是,当我们点击子窗口时,主窗口是收不到按键消息的,子窗口通过自己的回调函数处理消息。

eef1bd640932076c6d7d243c73e324c6.png

2b9114d05aa0f6548789950551a9eb04.png

6b332f3f45e93bb978e72bf3b6385b46.png

代码如下:有注释的

#include

#include"strsafe.h" // 安全字符串操作

// 定义回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);

HINSTANCE hInst; // 用来保存实例句柄,在下面创建子窗口CreateWindow用到

#define NUM 5 // 宏定义

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

WNDCLASSEX wc;

HWND hwnd;

MSG msg;

// 注册主窗口类

memset(&wc, 0, sizeof(wc));

wc.style = CS_HREDRAW | CS_VREDRAW;

wc.cbSize = sizeof(WNDCLASSEX);

wc.lpfnWndProc = WndProc;

wc.hInstance = hInstance;

wc.hCursor = LoadCursor(NULL, IDC_ARROW);

wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);

wc.lpszClassName = TEXT("WindowClass");

wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if (!RegisterClassEx(&wc)) {

MessageBox(NULL, TEXT("Window Registration Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK);

return 0;

}

// 注册子窗口类

wc.cbClsExtra = sizeof(long);

wc.hIcon = NULL;

wc.lpfnWndProc = ChildWndProc;

wc.lpszClassName = TEXT("ChildWindow");

RegisterClassEx(&wc);

// 创建主窗口

hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("WindowClass"), TEXT("Caption"), WS_CAPTION|WS_SYSMENU,

CW_USEDEFAULT, /* x */

CW_USEDEFAULT, /* y */

520, /* width */

542, /* height */

NULL, NULL, hInstance, NULL);

hInst = hInstance; // 保存实例句柄

ShowWindow(hwnd, nCmdShow);

UpdateWindow(hwnd);

if (hwnd == NULL) {

MessageBox(NULL, TEXT("Window Creation Failed!"), TEXT("Error!"), MB_ICONEXCLAMATION | MB_OK);

return 0;

}

while (GetMessage(&msg, NULL, 0, 0) > 0) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

// 主函数回调函数

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)

{

PAINTSTRUCT ps;

HDC hdc,mdc;

static int cxClient, cyClient,x=0,cx,cy;

static HWND childhwnd[NUM][NUM];

HBITMAP bmp;

int i, j;

WCHAR str[100];

switch (Message)

{

// 创建25个子窗口

case WM_CREATE:

{

for (i = 0; i < NUM; i++)

{

for (j = 0; j < NUM; j++)

{

childhwnd[i][j]=CreateWindowEx(0,TEXT("ChildWindow"), NULL, WS_CHILD|WS_VISIBLE,

100*i, /* x */

100*j, /* y */

98, /* width */

98, /* height */

hwnd, (HMENU)(x++), hInst, NULL);

}

}

break;

}

// 将赵丽颖美图贴上去,前面博客有讲

case WM_PAINT:

{

hdc = BeginPaint(hwnd, &ps);

mdc = CreateCompatibleDC(hdc);

bmp = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCEW(101), IMAGE_BITMAP, 500, 500, LR_CREATEDIBSECTION);

SelectObject(mdc, bmp);

BitBlt(hdc, 0, 0, 500, 500, mdc, 0, 0, SRCCOPY);

EndPaint(hwnd, &ps);

break;

}

// 主窗口响应左键,显示子窗口

case WM_LBUTTONDOWN:

{

cx = LOWORD(lParam);

cy = HIWORD(lParam);

i = cx/100;

j = cy/100;

ShowWindow(childhwnd[i][j], SW_SHOW); // 显示子窗口

break;

}

case WM_DESTROY:

{

PostQuitMessage(0);

break;

}

default:

return DefWindowProc(hwnd, Message, wParam, lParam);

}

return 0;

}

// 子窗口回调函数

LRESULT CALLBACK ChildWndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)

{

switch(Message)

{

// 子窗口响应左键,隐藏子窗口

case WM_LBUTTONDOWN:

{

ShowWindow(hwnd, SW_HIDE);

break;

}

// 其他消息处理,不能忘记啊

default:

return DefWindowProc(hwnd, Message, wParam, lParam);

}

return 0;

}

作者说:

这世道真的是人善被人欺!你越不反抗,别人越没有什么畏惧,就喜欢来惹事欺负,她总以为自己有多么了不起。妈的,你们一家子是看着我妈好欺负是吧,有事没事就对我妈发脾气骂人,我妈这才上去几天,都到我妈住的地方故意来找事了,骂的话还那么难听,真的,要是我不在,不然我真想冲上去,我妈本来就身体不好,不能着急的,心疼我妈。这人真的是,自己人品有问题还说我妈,要是你人好,怎么会和自己婆婆一见面就吵架,都呆在娘家二十几年了吧,你有本事咋不回去,在厂里干个活,三天两天不是和这个吵就是和那个吵,和我妈还是娘家的表姐妹,有这样做姐妹的呀,我是天底下没见过,既然你们一家子也说了,亲戚能走就走,不能走就不走,我也觉得这样最好,我以后也不希望能沾你们的光,大路朝天各走一边。别人骂我妈心里不好受,在这里吐槽一下,希望大家理解。

本文同步分享在 博客“战 胜”(CSDN)。

如有侵权,请联系 support@oschina.cn 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

最后

以上就是漂亮手机为你收集整理的mysql怎么创建窗口应用程序,Win32子窗口及其创建应用的全部内容,希望文章能够帮你解决mysql怎么创建窗口应用程序,Win32子窗口及其创建应用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部