MFC基础之windows模型编程
一、windows api
1、头文件windows.h
在windows.h中包含了一些windows api的函数,这些函数我们可以通过调用来实现,操作系统要做的事情,这样的调用我们也称之为系统的调用,
例如我们调用CreateWindow(这个函数,就可以创建一个窗口,调用MessageBox()可以弹出一个对话框等。
2、消息与消息队列
我们在进行一些动态的操作时,就会运用到消息与消息队列,例如我们按下鼠标左键,那么应用程序就会发送一个WM_LBUTTONDOWN消息,
也就是鼠标左键按下的消息,操作系统感知了这一消息,就会将事件转交给应用程序,然后应用程序就会对这一事件做出反应,从而我们就会得知,我们鼠标左键按下了。
消息队列,就是应用程序的每一个消息的处理,都会通过一个消息队列来实现,如下面的消息的结构体代码。
消息结构体
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,
int nCmdShow
) {
}
5、窗口类结构体
在我们创建一个窗口时首先要注册一个窗口,这是我们就会用到windows api中的窗口类。其结构体如下:
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 <Windows.h>
# include <stdio.h>
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) ;
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) ;
}
}
窗口