C++调用API初步创建Windows窗口程序

来源:互联网 发布:qc归属地 数据库 编辑:程序博客网 时间:2024/06/05 02:59

首先在进行介绍前,先介绍一下api,个人理解,api是在windows.h中提供的一些封装好的函数。

创建一个窗口程序的一般步骤是先注册一个窗口类名,然后再创建一个窗口,传递信息进行处理(窗口的操作都是通过信息传递来实现的)

下面介绍几个要用到api函数

RegistetClass()  //该函数只有一个参数,是一个指向WNDCLASS结构的指针

//该函数用来注册一个窗口类

WNDCLASS:一个包含了窗口类的全部信息的数据结构

typedef struct _WNDCLASS {UINT style;// 窗口类型WNDPROC lpfnWndProc;//窗口处理函数int cbClsExtra;//窗口扩展int cbWndExtra;//窗口实例扩展HINSTANCE hInstance;//实例句柄HICON hIcon;//窗口的最小化图标HCURSOR hCursor;//窗口鼠标光标HBRUSH hbrBackground;//窗口背景色LPCTSTR lpszMenuName;//窗口菜单LPCTSTR lpszClassName;// 窗口类名} WNDCLASS, *LPWNDCLASS;

CreateWindowEx()//该函数有多个参数,用来创建一个窗口

HWND CreateWindowEx(DWORD DdwExStyle,        //窗口的扩展风格LPCTSTR lpClassName,    //指向注册类名的指针LPCTSTR lpWindowName,   //指向窗口名称的指针DWORD dwStyle,          //窗口风格int x,                  //窗口的水平位置int y,                  //窗口的垂直位置int nWidth,             //窗口的宽度int nHeight,            //窗口的高度HWND hWndParent,        //父窗口的句柄HMENU hMenu,            //菜单的句柄或是子窗口的标识符HINSTANCE hInstance,    //应用程序实例的句柄LPVOID lpParam          //指向窗口的创建数据);

ShowWindow(hwnd,bool)//该函数用来显示/隐藏窗口

接下来介绍一个结构体MSG,该结构体用来存储窗口传递的消息

 typedef struct tagMSG {  HWND hwnd;  UINT message;  WPARAM wParam;  LPARAM lParam;  DWORD time;  POINT pt; } MSG;

GetMessage() //该函数用来从调用该函数的线程中取回一个与指定窗口相关联和由PostThreadMessage寄送的线程消息的消息,并将之从消息队列中删除,该函数会一直等到有消息取出才返回

GetMessage(LPMSG lpMsg,//指向MSG结构的指针,该结构从线程的消息队列里接收消息信息HWND hWnd,//取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。UINT wMsgFilterMin,//指定被检索的最小消息值的整数。可省略UINT wMsgFilterMax//指定被检索的最大消息值的整数。可省略)//返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1

TranslateMessage(&MSG)//该函数将虚拟键消息转换为字符信息。字符消息将被寄送到调用线程的消息队列里

DispatchMessage(&MSG)//该函数分发一个消息给过程函数 lpfnWndProc,然后窗口进入消息处理阶段。

DefWindowProc(hwnd,MSG,lParam,wParam)//该函数用来处理所不想处理的消息,确保每个消息得到处理

下面介绍一个函数

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//该函数就是处理消息的过程函数(回调函数)

下面是代码

#include<windows.h>LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);HINSTANCE hinhwnd = 0;HWND editor = 0;int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdeShow){const wchar_t CLASS_NAME[] = L"test";//类名WNDCLASS wc = {};wc.style = 0;//缺省wc.cbClsExtra = 0;//缺省wc.cbWndExtra = 0;//缺省wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//缺省wc.hCursor = LoadCursor(NULL, IDC_ARROW);//箭头光标wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));//白色刷子wc.lpszMenuName = NULL;//无菜单wc.lpfnWndProc = WindowProc;//消息处理函数hinhwnd=wc.hInstance = hInstance;wc.lpszClassName = CLASS_NAME;RegisterClass(&wc);HWND hwnd = CreateWindowEx(0,CLASS_NAME,L"test",//标题WS_OVERLAPPEDWINDOW,//一般风格CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,//默认位置及尺寸NULL,NULL,hInstance,NULL);if (hwnd == NULL)return 0;ShowWindow(hwnd,1);MSG msg = {};while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return 0;}LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_DESTROY:{PostQuitMessage(0);return 0;}case WM_PAINT:{PAINTSTRUCT ps;HDC hdc = BeginPaint(hwnd, &ps);FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));EndPaint(hwnd, &ps);}return 0;}return DefWindowProc(hwnd, uMsg, wParam, lParam);}

以上是运行效果,如果需要或许更多详细的API使用方法可以参考MSDN(虽然我一般选择百度)

个人建议,但是如果实在实在实在实在是搞不懂每个参数每句代码的意义的话,不要钻牛角尖,可以通过多接触这方面的知识后再来理解,毕竟这个只是第一个程序。

该程序运行系统为win10/运行工具为Visual Studio 2015








原创粉丝点击