在windows.h中包含了一些windows api的函数,这些函数我们可以通过调用来实现, *** 作系统要做的事情,这样的调用我们也称之为系统的调用,
例如我们调用CreateWindow(这个函数,就可以创建一个窗口,调用MessageBox()可以d出一个对话框等。
2、消息与消息队列
我们在进行一些动态的 *** 作时,就会运用到消息与消息队列,例如我们按下鼠标左键,那么应用程序就会发送一个WM_LBUTTONDOWN消息,
也就是鼠标左键按下的消息, *** 作系统感知了这一消息,就会将事件转交给应用程序,然后应用程序就会对这一事件做出反应,从而我们就会得知,我们鼠标左键按下了。
消息队列,就是应用程序的每一个消息的处理,都会通过一个消息队列来实现,如下面的消息的结构体代码。
消息结构体
//msdn中查询的消息结构体
typedef struct {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG, *PMSG;
3、句柄
在程序中我们使用HANDLE来表示一个句柄,句柄是资源的一个标识,我们平常的窗口可以表示为一个窗口句柄,我们窗口的图标可以表示为一个图标句柄,光标可以表示为光标句柄等各种的句柄,
每一个句柄都有一个唯一的标识号。
4、入口函数
在我们C++程序编程中通常是以int main(){}作为程序的一个入口函数,但是在windows api中我们是以另一个形式的入口函数来表示,int WINAPI WinMain()
int WINAPI WinMain(
HINSTANCE hInstance, //当前窗口的实例,也就是我们打开一个程序就会有一个实例创建
HINSTANCE hPrevInstance,//上一个窗口实例,当我们重复打开两个窗口时,之前的那个窗口就是上一个窗口的实例
LPSTR lpCmdLine,//这是参数列表相当于我们C++中的int main(char agrc,char*argv[])中的argv一个参数
int nCmdShow//窗口展示的模式,最大化、最小化、还是普通模式展示
){
//代码块
}
5、窗口类结构体
在我们创建一个窗口时首先要注册一个窗口,这是我们就会用到windows api中的窗口类。其结构体如下:
//msdn中查询的WNDCLASS类
typedef struct tagWNDCLASSW {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
} WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
UNINT style ;设置窗口的风格。例如CS_VREDRAW 、 CS_HREDRAW改变窗口大小时,会重画窗口。
WNDPROC lpfnWndProc;消息的回调函数,我们需要自己设定一个回调函数来响应消息。
int cbClsExtra; 指定按照窗口类结构分配的额外字节数。系统将字节初始化为零。
int cbWndExtra;指定在窗口实例之后要分配的额外字节数。系统将字节初始化为零。如果应用程序使用WNDCLASSEX注册通过在资源文件中使用CLASS指令创建的对话框,则必须将此成员设置为DLGWINDOWEXTRA。
HINSTANCE hInstance;窗口的实例
HICON hIcon;程序的设置图标;
HCURSOR hCursor;设置程序的光标
HBRUSH hbrBackground;背景画刷
LPCWSTR lpszMenuName;菜单栏名称
LPCWSTR lpszClassName;窗口类的名称
二、消息
在主函数中我们需要进行消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) { //不断地获取当前窗口的消息
TranslateMessage(&msg);
DispatchMessage(&msg);
}
在回调函数中进行消息的实现
switch (uMsg)
{
case WM_CHAR: //处理键盘字符的消息
WCHAR szChar[20];
wsprintf(szChar, L"char is %d", wParam);
MessageBox(hwnd, szChar, L"sun", 0);
break;
case WM_CLOSE://窗口关闭消息
if (IDYES == MessageBox(hwnd, L"are you exit", L"hh", MB_YESNO)) {
DestroyWindow(hwnd);
}
break;
case WM_LBUTTONDOWN: //左键按下消息
MessageBox(hwnd, L"mouse click", L"点击了", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, TEXT("This is Text two"), strlen("This is Text two"));
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT: //画图消息
HDC hdc1;
PAINTSTRUCT ps;
hdc1 = BeginPaint(hwnd, &ps);
TextOut(hdc1, 0, 0, TEXT("This is Text one"), strlen("This is Text one"));
EndPaint(hwnd, &ps);
break;
case WM_DESTROY://窗口注销消息
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam); //返回缺省值
}
三、简单的windows窗口实现
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
LRESULT CALLBACK WinSunBack(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
LPCWSTR strClassName = TEXT("winsun");
WNDCLASS wnd;
wnd.style = CS_VREDRAW | CS_HREDRAW;
wnd.lpfnWndProc = WinSunBack;
wnd.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wnd.hCursor = LoadCursor(NULL, IDC_CROSS);
wnd.hIcon = LoadIcon(NULL, IDI_WINLOGO);
wnd.cbWndExtra = 0;
wnd.cbClsExtra = 0;
wnd.hInstance = hInstance;
wnd.lpszClassName = strClassName;
wnd.lpszMenuName = NULL;
RegisterClass(&wnd);
HWND hwnd;
hwnd = CreateWindow(strClassName, TEXT("windows API"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
CW_USEDEFAULT, CW_USEDEFAULT,
NULL, NULL, hInstance, NULL);
ShowWindow(hwnd, SW_SHOWNORMAL);
//UpdateWindow(hwnd);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WinSunBack(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CHAR:
WCHAR szChar[20];
wsprintf(szChar, L"char is %d", wParam);
MessageBox(hwnd, szChar, L"sun", 0);
break;
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, L"are you exit", L"hh", MB_YESNO)) {
DestroyWindow(hwnd);
}
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, L"mouse click", L"点击了", 0);
HDC hdc;
hdc = GetDC(hwnd);
TextOut(hdc, 0, 50, TEXT("This is Text two"), strlen("This is Text two"));
ReleaseDC(hwnd, hdc);
break;
case WM_PAINT:
HDC hdc1;
PAINTSTRUCT ps;
hdc1 = BeginPaint(hwnd, &ps);
TextOut(hdc1, 0, 0, TEXT("This is Text one"), strlen("This is Text one"));
EndPaint(hwnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
}
窗口
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)