windows编程-01SDK编程01

控制台程序(CUI)与平台无关是通用的。

widows平台上的开发的程序只能在windows上运行,不可移植。

 创建的控制台程序和windows窗口程序本质不一样是链接的不一样,其他都一样。

SDK开发就是在某个平台上开发。

学习SDK编程一定要学会查文档也就是查MSDN。

选中函数按下F1键,即可查询这个函数的官方文档,需要联网在线查看。

#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hInstPrev, PSTR cmdline, int cmdshow)
{
    return MessageBox(NULL, L"hello, world", L"caption", 0);
}

其中WinMain是GUI程序的函数入口,MessageBox是一个对话框。

窗口

窗口时一个抽象的概念,一切图形界面都由窗口组成,可以用SPY++来判断一个软件界面是不是窗口,由边框的就是窗口。子窗口的左边是相对于父窗口而言,父窗口的坐标是相对于屏幕的分辨率。所有窗口的父窗口都是桌面。

句柄

我们创建窗口的时候,都是操作系统在0环帮我们完成的,创建完窗口之后,0环会保存窗口的信息,但是我们不能直接访问0环的信息,可以通过句柄来访问,查看我们创建窗口的信息,所以等价于内核对象的索引。 

#include <windows.h>
#include <tchar.h>


//WNDPROC Wndproc;

// 所有的API的调用约定都是stdcall
LRESULT CALLBACK Wndproc(
    HWND hwnd,
    UINT message,
    WPARAM wParam,
    LPARAM lParam
) {
    switch (message)
    {
    case WM_CREATE:
        return 0;
   

    case WM_DESTROY:
        PostQuitMessage(0);//发送退出码
        return 0;
    default:
        break;
    }

    return DefWindowProc(hwnd, message, wParam, lParam);//调用系统默认的API来处理消息
 
   
}


int APIENTRY WinMain(HINSTANCE hInst,  //应用程序实例句柄,也就是应用程序的地址
    HINSTANCE hInstPrev,               //前一个应用程序的实例句柄(保留)
    PSTR cmdline,                // 命令行参数
    int cmdshow)                 //窗口显示方式(最大最小化)
{
    int nResult = MessageBox(0, _T("hello, world"), _T("caption"), 0);
    if (nResult == 0) {
        int error = GetLastError();   //返回最后一次的错误码
        return 0;
    } 
    
    //进程可以产生多个窗口
    //1.注册窗口
    TCHAR szWndClassName[] = { _T("CR48615618") };
    WNDCLASSEX wc = { 0 };
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_VREDRAW | CS_HREDRAW; //窗口类型
    wc.lpfnWndProc = Wndproc;   //窗口过程函数,用于处理消息
    wc.hInstance = hInst;
    wc.hIcon = NULL;
    wc.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_APPSTARTING);//光标
    wc.hbrBackground = (HBRUSH)COLOR_GRAYTEXT;//窗口背颜色
    wc.lpszMenuName = NULL;//菜单名称
    wc.lpszClassName = szWndClassName;// 窗口类型也就是窗口的唯一标识符
    if (RegisterClassEx(&wc) == 0) {
        int error = GetLastError();   //返回最后一次的错误码
        MessageBox(0, L"error", 0, 0);
        return 0;
    }
    //CreateCursor  创建具有指定大小、位模式和热点的单色游标
    //LoadCursorA  加载光标

    //2.创建窗口
    HWND hWnd = CreateWindowEx(0, szWndClassName, _T("51asm"), 
        WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_VISIBLE |WS_OVERLAPPED | WS_SYSMENU,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInst,
        NULL);
    if (hWnd == NULL) {
        int error = GetLastError();   //返回最后一次的错误码
        MessageBox(0, L"error", 0, 0);
        return 0;
    }

    //3.显示窗口
    ShowWindow(hWnd,SW_SHOWNORMAL);
    SetClassLongPtr(hWnd,
        -12,
        (long)LoadCursorA(NULL,(LPCSTR)IDC_HAND));

    //4.消息循环(消息队列以进程为单位创建)
    MSG msg;
    int bRet;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0) {
        if (bRet == -1) {
            break;
        }
        else {
            //TranslateMessage(&msg);
            DispatchMessage(&msg);//派发消息
        }
    }
    
    //5.消息处理

    return 0;
}

客户区域是我们创建的,非客户区域是系统创建的,同时系统会处理非客户区域的消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值