MFC基础之windows模型编程

MFC基础之windows模型编程,第1张

MFC基础之class="superseo">windows模型编程 一、windows api 1、头文件windows.h
	在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);
	}
}
窗口

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/874677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存