[windows] _ windows编程基础_01

windows API,为应用程序提供windows系统特殊函数以及数据结构.
windows应用程序可以利用大量api函数调用系统功能.
是win系统与应用程序间的标准程序接口.


几个类别

  • 窗口管理函数: 实现窗口创建,移动和修改功能.
  • 系统服务函数: 实现与操作系统有关的多种功能.
  • 图形设备函数: 实现与设备无关的图形操作功能.

windows程序的几个概念:

  • 窗口概念:

是系统管理应用程序的基本单位,应用程序与用户交互的接口环境.是win应用程序基本的操作单元.

图片.png
  • 事件驱动概念:
图片.png
  • 句柄概念:
    句柄是一个8字节长(相当于64位操作系统)的数值,用于表示应用程序中不同的对象和同类对象的不同的实例.
图片.png
  • 消息的概念:
图片.png

观察MSG结构体的定义:

图片.png
图片.png

  • windows 应用程序组成以及编程步骤
图片.png
图片.png
图片.png
  • 定义窗口类
  • 注册窗口类
  • 创建一个窗口类的实例
  • 显示窗口
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
  • 消息循环
图片.png
  • 窗口函数 WinProc
图片.png
图片.png
// 主函数,入口函数.函数说明,初始化,进入消息循环.
// 四个参数,分别传入当前句柄,父窗口句柄,命令行指针(给应用程序下命令的),样式.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrstance,LPSTR lpszCmdLine,int nCmdShow) {

    HWND hwnd; // 定义一个窗口句柄
    MSG mMsg; // 定义一消息实例.

    // 定义一个窗口类实例.
    WNDCLASS wndclass; 
    // unicode 编码.
    wchar_t lpszClassName[] = L"窗口";// 窗口类名.
    wchar_t lpszTitle[] = L"my_windows";// 窗口标题名.

    wndclass.cbClsExtra = 0; // 窗口类无扩展
    wndclass.cbWndExtra = 0; // 窗口实例无扩展
    wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); // 背景颜色,使用系统画刷填充.
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 系统光标
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 图标,使用系统.
    wndclass.hInstance = hInstance; // 当前实例句柄.
    wndclass.lpfnWndProc = WinProc; // 定义窗口处理函数
    wndclass.lpszClassName =lpszClassName; // 类名
    wndclass.lpszMenuName = NULL; // 菜单名.
    wndclass.style = 0; //值设0,默认样式,缺省处理.(详细设置,class style cs_)

    // 注册窗口类
    if (!RegisterClass(&wndclass))
    {
        MessageBeep(0);
        return FALSE;
    }

    // 创建窗口.
    hwnd = CreateWindow(
        lpszClassName, // 窗口类名
        lpszTitle, // 窗口名
        WS_OVERLAPPEDWINDOW, // 窗口风格window style
        CW_USEDEFAULT, 
        CW_USEDEFAULT,  //窗口左上角坐标 usedefault 使用默认值(缺省,使用系统默认大小)
        CW_USEDEFAULT,
        CW_USEDEFAULT, // 窗口高宽使用默认值.
        NULL, // 无父窗口
        NULL, // 无菜单项(menu) window系统的一种资源.
        hInstance, // 创建此窗口的当前实例句柄
        NULL // lParam 类型.设为NULL不使用该值.
        );

    // 显示窗口
    ShowWindow(hwnd,nCmdShow);
    // 跟新,绘制用户区.
    UpdateWindow(hwnd);
    // 进入消息循环
    while (GetMessage(&mMsg,NULL,0,0))
    {
        TranslateMessage(&mMsg); // 将消息的虚拟键转换为字符消息
        DispatchMessage(&mMsg); // 将消息传送到指定的窗口函数
    }
    return mMsg.wParam;
}

// 窗口函数,消息处理函数,回调函数.
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {

    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0); // 退出.
        return 0;
    default:
        return
        DefWindowProc(hWnd, uMsg, wParam, lParam); // 缺省的消息处理
    }
}

  • 数据类型:
图片.png
  • 数据结构
图片.png
  • WNDCLASSEX 结构


    图片.png
  • RECT 结构

图片.png
图片.png

  • 总结一下创建一个windows程序的过程:

引入头文件<windows.h>,声明入口函数 WinMain函数,其带入的四个参数,第一个是当前的实例句柄,第二个父窗口句柄,第三个LPSTR类型的指针,指向命令行指令.第四个是整型的样式值.

主函数需要先通过WNDCLASS wndclass;来进行窗口类的定义,然后通过RegisterClass(&wndclass)注册窗口类,如果注册失败,返回FALSE.如果注册成功,则通过HWND hWnd = CreateWindow()创建一个窗口.并初始化.如果创建失败返回FALSE,否则通过ShowWindow(hInstance,nCmdShow)显示,并使用UpdateWindow(hWnd)更新窗口.在主函数中定义一个MSG结构体变量 mMsg,通过while循环和GetMessage(&mMsg)进入消息循环,循环中不端通过TranslateMessage(&mMsg)将虚拟键消息转换为字符消息,再通过DispatchMessage(&mMsg)将消息分派到指定的窗口函数.进入窗口函数WndProc(),WndProc函数有四个参数,分别传入消息发生的窗口句柄,消息类型,消息所携带的字参数wParam和长字参数lParam,通过switch(mMsg)结构分别对接收到的不同消息做处理.在默认情况下要通过DefWindowProc()函数做默认(缺省)处理.当接收到WM_DESTROY消息是通过PostQuitMessage()函数退出消息循环.并在主函数中返回一个mMsg的字参数(wParam)作为程序的结束.


2019.1.3
11.08

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272