动手写window程序

主要过程
1.设计窗口类
2.创建窗口
3.显示刷新窗口
4.消息循环处理(外部定义了消息过程)

#include <Windows.h>
#include <stdio.h>
#include "resource.h"

//声明消息过程
LRESULT CALLBACK WinSunProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
);

int WINAPI WinMain( 
    HINSTANCE hInstance, // 我是谁
    HINSTANCE hPrevInstance,//谁生的我
    LPSTR lpCmdLine, //命令行参数
    int nShowCmd  //显示状态
    )
    {
        //设计一个窗口类;
        WNDCLASS wndcls;
        wndcls.cbClsExtra = 0;
        wndcls.cbWndExtra = 0;//附加内存空间,一般为0
        //GetStockObject 获取已经预定义的窗口标识
        wndcls.hbrBackground =(HBRUSH) GetStockObject(BLACK_BRUSH);
        //LoadCursor 返回值
        wndcls.hCursor = LoadCursor(NULL,IDC_CROSS );
        wndcls.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON2));//设置窗口的图标
        wndcls.hInstance = hInstance;  //所在的程序id是谁,即我自己
        wndcls.lpfnWndProc = WinSunProc; //窗口过程函数  类型为 WNDPROC
        wndcls.lpszClassName = "hzz";//注册窗口类的名称,CreateWindow时要通过类名来找到该类
        wndcls.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); //通过id转换成lpcstr
        wndcls.style = CS_HREDRAW | CS_VREDRAW; //窗口样式
        RegisterClass(&wndcls);

        //创建窗口
        HWND hwnd;
        hwnd = CreateWindow(
            "hzz",
            "hzz_window",
            WS_OVERLAPPEDWINDOW,//
            0,
            0,
            600,
            400,
            NULL,
            NULL,
            hInstance,
            NULL
            );
        if (!hwnd)
        {
            int x = GetLastError();//通过此方式获取创建窗口失败的原因
            int y=0;
        }

        //显示刷新窗口
        ShowWindow(hwnd,SW_SHOWNORMAL);
        UpdateWindow(hwnd);

        //定义消息结构体,开始循环
        MSG msg;
        //GetMessage()从窗口对应的窗口队列中获取该窗口的消息
        //hwnd 指接受所属窗口的消息,如果NULL则指线程所属窗口的消息
        //后边两个参数分别表示 接受的消息最小值和最大值
        while (GetMessage(&msg,NULL,0,0))
        {
            //将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。
            TranslateMessage(&msg);//
            //该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是WinSunProc()函数。
            DispatchMessage(&msg);
        }
        return msg.wParam;
    }

LRESULT CALLBACK WinSunProc( 
    HWND hwnd, 
    UINT uMsg, 
    WPARAM wParam, 
    LPARAM lParam 
)
{
    switch(uMsg)
    {
    case WM_CHAR:
        char ch[20];
        sprintf_s(ch,"char code is %d",wParam);
        MessageBox(hwnd,ch,"char",0);
        break;
    case WM_LBUTTONDOWN:
        MessageBox(hwnd,"mouse clicked","caption",0);
        HDC hdc;
        hdc = GetDC(hwnd);
        TextOut(hdc,0,50,"HAH",strlen("HAH"));
        //ReleaseDC(hwnd,hdc);
        break;
    case WM_PAINT:

        PAINTSTRUCT ps;
        hdc = BeginPaint(hwnd,&ps);

        LPWSTR *szArgList;
        int argCount;
        szArgList = CommandLineToArgvW(GetCommandLineW(),&argCount);
        if (!szArgList)
        {
            MessageBox(NULL,"unable to parse command line","Error",MB_OK);
            return  -1;
        }
        for (int i = 0;i<argCount;i++)
        {
            //MessageBoxW(NULL,szArgList[i],L"haha",MB_OK);
        }

        //TextOut(hdc,0,0,"paint",strlen("paint"));
        EndPaint(hwnd,&ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return ::DefWindowProc(hwnd,uMsg,wParam,lParam);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/writeeee/article/details/70196748