Windows编程-窗口操作函数

通用函数

函数说明
MoveWindow 移动窗口
UpdateWindow 更新窗口
GetWindowText 获取文本框内容
SetWindowText 设置窗口标题
FindWindow 查找窗口返回句柄
GetClientRect 获取窗口客户区大小
SetWindowPos 设置窗口位置

移动窗口-MoveWindow

BOOL MoveWindow(
HWND hWnd,
int X,
int Y,
int nWidth,
int nHeight,
BOOL bRepaint
);

第一个参数是窗口的句柄,VM_COMMAND的窗口句柄会在传MSG的时候用lParam附加消息选项来传,也可以用自己的窗口句柄

第二个和第三个表示左上角起始左边

第四个和第五个表示窗口的范围

第六个BRepaint表示是否重绘也就是重新画出来。

//例子
void Move_Window(HWND hwnd)
{
MoveWindow(hwnd, 300, 100, BUT_WIDTH, BUT_HEIGHT, TRUE);
}

获取窗口大小-GetClientRect

BOOL GetClientRect(
HWND   hWnd,
LPRECT lpRect
);

函数通过第一个参数的hwnd句柄获取大小返回给一个pect类的指针,rect类是用来描述长方形的4个点的左边

typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;

例子:

LPRECT Get_Win_Rect(HWND hwnd)
{
LPRECT Main_Rect = new RECT;
GetClientRect(hwnd, Main_Rect);
return Main_Rect;
}

获取文本框内容-GetWindowText

将指定窗口标题栏的文本(如果有的话)复制到缓冲区中。如果指定的窗口是控件,则复制该控件的文本。窗口就获取窗口的标题,如果是控件就获取控件的文本

int GetWindowTextA(
HWND hWnd,
LPSTR lpString,
int   nMaxCount
);

第一个参数表示句柄

第二个参数表示缓冲区指针

第三个参数表示接受的最大数量

//例子:

void Get_My_WindowText(HWND hwnd)
{
WCHAR a[100] = { 0 };
GetWindowText(hwnd, a, 100);
MessageBox(hwnd, a, L"获取文本框的内容", MB_OK);
}

获取窗口的句柄-GetDlgItem()

在指定的对话框中检索控件的句柄。

HWND GetDlgItem(
HWND hDlg,
int nIDDlgItem
);

参数:第一个参数表示包含该控件的对话框的句柄,简单来说就是该控件镶嵌在的窗口的句柄,第二个参数表示控件的标识符

HWND Get_Hwnd= GetDlgItem(hwnd,0x104);

设置文本框内容-SetWindowText

更改指定窗口标题栏的文本(如果有的话)。如果指定的窗口是控件,则更改控件的文本。

BOOL SetWindowTextA(
HWND   hWnd,
LPCSTR lpString
);
void Set_MyWindow_Text(HWND hwnd)
{
WCHAR a[] = L"sm7 6666";
HWND hwnd_T = GetDlgItem(hwnd, 0x104);
SetWindowText(hwnd_T, a);
}

设置文本框内容SetDlgItemText()

BOOL SetDlgItemTextA(
HWND   hDlg,
int   nIDDlgItem,
LPCSTR lpString
);
WCHAR a[] = "hello world";
SetDlgItemText(hwnd,id,a)

第一个是父窗口的句柄,第二个是控件ID,第三个是字符串

设置父窗口-SetParent()

给一个窗口设置新的父窗口

HWND SetParent(
HWND hWndChild,
HWND hWndNewParent
);

 

//例子
void Set_MyWindow_Father(HWND hwnd_child, HWND hwnd_parent)
{
SetParent(hwnd_child, hwnd_parent);
}

查找窗口句柄-FindWindow()

检索顶级窗口的句柄,该顶级窗口的类名和窗口名与指定的字符串匹配。此功能不搜索子窗口。此功能不执行区分大小写的搜索。

要从指定的子窗口开始搜索子窗口,请使用FindWindowEx函数。

HWND FindWindowA(
LPCSTR lpClassName,
LPCSTR lpWindowName
);

如果第一个参数为NULL,那么将会遍历所有窗口然后找到标题为

lpWindowName的窗口

转换字符消息-TranslateMessage

为了能够获取到消息来进行输入输出,需要把虚拟的消息转换为字符串来处理。

将虚拟键消息转换为字符消息。字符消息将发布到调用线程的消息队列中,以在线程下次调用GetMessage或PeekMessage函数时读取。

BOOL TranslateMessage(
const MSG *lpMsg
);

枚举窗口下的所有子窗口-EnumChildWindows

通过将句柄传递给每个子窗口并依次传递给应用程序定义的回调函数,可以枚举属于指定父窗口的子窗口。EnumChildWindows继续,直到枚举最后一个子窗口或回调函数返回FALSE为止。

 

BOOL EnumChildWindows(
HWND       hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM     lParam
);

第一个参数是窗口的句柄

第二个参数表示是一个回调函数

BOOL CALLBACK EnumChildProc(
_In_ HWND   hwnd,
_In_ LPARAM lParam
);
第一个表示父窗口的子窗口的句柄
第二个表示上一个函数定义的lParam参数

第三个参数是回调函数的参数

 

 

总结

#include<Windows.h>
#include<CommCtrl.h>
#include<iostream>
void Move_Window(HWND hwnd);
LPRECT Get_Win_Rect(HWND hwnd);
void Get_My_WindowText(HWND hwnd);
void Set_MyWindow_Text(HWND hwnd);
void Set_MyWindow_Father(HWND hwnd_child, HWND hwnd_parent);
#define BUT_WIDTH 120
#define BUT_HEIGHT 40
using namespace std;
void Move_Window(HWND hwnd)
{
MoveWindow(hwnd, 300, 100, BUT_WIDTH, BUT_HEIGHT, TRUE);
}
void Get_My_WindowText(HWND hwnd)
{
WCHAR a[100] = { 0 };
GetWindowText(hwnd, a, 100);
MessageBox(hwnd, a, L"获取文本框的内容", MB_OK);
}
void Set_MyWindow_Text(HWND hwnd)
{
WCHAR a[] = L"sm7 6666";
HWND hwnd_T = GetDlgItem(hwnd, 0x104);
SetWindowText(hwnd_T, a);
}
void Set_MyWindow_Father(HWND hwnd_child, HWND hwnd_parent)
{
SetParent(hwnd_child, hwnd_parent);
}
BOOL CALLBACK EnumChildProc(HWND hwnd,LPARAM lParam)
{
WCHAR BUF[100];
GetWindowText(hwnd, BUF, 100);
MessageBox(NULL,BUF,L"获取的所有子窗口",MB_OK);
return TRUE;
}
LPRECT Get_Win_Rect(HWND hwnd)
{
LPRECT Main_Rect = new RECT;
GetClientRect(hwnd, Main_Rect);
return Main_Rect;
}
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
static HINSTANCE hInstance = GetModuleHandle(NULL);
switch (uMsg)
{
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
WCHAR buf[1024];
wsprintf(buf, TEXT("x = %d,y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("鼠标左键摁下"), MB_OK);//弹出窗口
break;
}
case WM_CREATE:
// MessageBox(hwnd, L"窗口创建成功", L"创建窗口", MB_OK);
static HWND but1 = CreateWindow(WC_BUTTON, L"移动按钮",WS_CHILD | WS_VISIBLE,10,10,BUT_WIDTH,BUT_HEIGHT,hwnd,(HMENU)0x100,hInstance,NULL);
CreateWindow(WC_BUTTON, L"获取文本框内容", WS_CHILD | WS_VISIBLE, 10, 60, BUT_WIDTH, BUT_HEIGHT, hwnd, (HMENU)0x101, hInstance, NULL);
CreateWindow(WC_BUTTON, L"设置文本框内容", WS_CHILD | WS_VISIBLE, 10, 110, BUT_WIDTH, BUT_HEIGHT, hwnd, (HMENU)0x102, hInstance, NULL);
CreateWindow(WC_BUTTON, L"设置父窗口", WS_CHILD | WS_VISIBLE, 10, 160, BUT_WIDTH, BUT_HEIGHT, hwnd, (HMENU)0x103, hInstance, NULL);
CreateWindow(WC_EDIT, L"sm7", WS_CHILD | WS_BORDER| WS_VISIBLE, 10, 320, 320, 80, hwnd, (HMENU)0x104, hInstance, NULL);
CreateWindow(WC_BUTTON, L"获取所有子窗口", WS_CHILD | WS_VISIBLE, 10, 400, BUT_WIDTH, BUT_HEIGHT, hwnd, (HMENU)0x105, hInstance, NULL);
break;
case WM_CLOSE:
MessageBox(hwnd, L"窗口关闭成功", L"窗口关闭", MB_OK);
DestroyWindow(hwnd);
PostQuitMessage(0);
exit(0);
break;
case WM_COMMAND:
switch (LOWORD(wParam))
{
case 0x100://移动button1按钮
{
//LPRECT Win_Rect = Get_Win_Rect(hwnd);
Move_Window(but1);
break;
}
case 0x101://获取文本框内容
{
HWND Get_Hwnd= GetDlgItem(hwnd,0x104);
Get_My_WindowText(Get_Hwnd);
break;
}
case 0x102://设置文本框内容
{
Set_MyWindow_Text(hwnd);
break;
}
case 0x103://设置父窗口
{
Set_MyWindow_Father((HWND)lParam,(HWND)0x00850CC2);
break;
}
case 0x104://修改文本框内容
{

break;
}
case 0x105://遍历子窗口
{
EnumChildWindows(hwnd, EnumChildProc, 0);
break;
}
default:
break;
}
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//1 创建一个窗口类
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;
myclass.hbrBackground = (HBRUSH)COLOR_GRAYTEXT;

//2注册窗口类
RegisterClass(&myclass);

//3创建窗口
HWND hMyWindow = CreateWindow(
myclass.lpszClassName,
L"sm7的窗口",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);


//4显示窗口
ShowWindow(hMyWindow, SW_SHOW);

//5获取消息
MSG message;
LPMSG MESSAGE = &message;
while (GetMessage(MESSAGE, hMyWindow, 0, 0))
{
TranslateMessage(MESSAGE);
DispatchMessage(MESSAGE);
}
return 0;
}