Windows第一次实验1,2



第一个程序:

HINSTANCE hInstance
  程序可执行模块的句柄(內存中的.exe文件).
HINSTANCE hPrevInstance
  在Win32程序中总是为NULL.
LPSTR lpCmdLine
  命令行参数组成的一个单字符串.不包括程序名字.
int nCmdShow
  一个将要传递给ShowWindow()的整数



#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;
}







第二个程序:建立一个窗口

第一步:注册窗口类

第二步:创建窗口

第三步:消息循环

第四步:窗口过程


结构体的成员对窗口类的影响如下:
cbSize
  结构体的大小.
style
  类的式样(CS_*),不要跟窗口式样(WS_*)混淆了.这个一般设置为0.
lpfnWndProc
  指向这个窗口类的窗口过程的指针.
cbClsExtra
  配置给这个类的额外內存.一般为0.
cbWndExtra
  配置给这个类的每个窗口的额外內存.一般为0.
hInstance
  应用程序实例的句柄.(从WinMain()第一个参数传递来.)
hIcon
  当用戶按下Alt+Tab组合时候显示的大图标(一般为32*32).
hCursor
  在我们的窗口上显示的光标.
hbrBackground
  设置我们窗口背景顏色的背景刷子.
lpszMenuName
  这个类的窗口所用的菜单资源的名字.
lpszClassName
  类的名字.
hIconSm

#include <windows.h>

const char g_szClassName[] = "myWindowClass";

// Step 4: the Window Procedure
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
{
    WNDCLASSEX wc;
    HWND hwnd;
    MSG Msg;

    //Step 1: Registering the Window Class
    wc.cbSize        = sizeof(WNDCLASSEX);
    wc.style         = 0;
    wc.lpfnWndProc   = WndProc;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.hInstance     = hInstance;
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    wc.lpszMenuName  = NULL;
    wc.lpszClassName = g_szClassName;
    wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);

    if(!RegisterClassEx(&wc))
    {
        MessageBox(NULL, "Window Registration Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    // Step 2: Creating the Window
    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

    if(hwnd == NULL)
    {
        MessageBox(NULL, "Window Creation Failed!", "Error!",
            MB_ICONEXCLAMATION | MB_OK);
        return 0;
    }

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // Step 3: The Message Loop
    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;
}



HWND hwnd;

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        g_szClassName,
        "The title of my window",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
        NULL, NULL, hInstance, NULL);

  第一个参数WS_EX_CLIENTEDGE是扩展的窗口式样这里我设置它想得到一个內部下陷的边框效果;


接下来我设置了类的名字g_szClassName),告诉系统我们要创建什么样的窗口我们设置的WS_OVERLAPPEDWINDOW是一个窗口式样参数


.接下来的四个参数CW_USEDEFAULTCW_USEDEFAULT320240是我们窗口的左上角的XY坐标和其宽度和高度我把XY坐标设为CW_USEDEFAULT来让系统自己选择在屏幕的哪个地方来放置窗口记住屏幕的最左边的X坐标为0并向右加屏幕的顶部的Y坐标为0并向底加.单位是像素这是屏幕在特定的分辨率下能显示的最小单位

  再接下来的四个NULLNULLg_hInstNULL分別是父窗口的句柄菜单句柄应用程序实例句柄和窗口创建数据的指针.windows系统中你屏幕上的窗口是以分层次的父窗口子窗口的形式来组织的当你看到一个窗口中有一个按钮时候按钮就是子窗口包含它的窗口就是父窗口.我们的例子中父窗口的句柄为NULL因为这里沒有父窗口这个是是我们的主窗口或是顶层窗口.菜单也是NULL因为我们现在也沒有菜单.实例句柄设为我们从WinMain()得到的第一个参数.窗口的创建数据(我们几乎沒有使用)可以用来向创建的窗口发送额外数据在这里也设为NULL

if(hwnd == NULL)   

        MessageBox(NULL, "Window Creation Failed!", "Error!", MB_ICONEXCLAMATION | MB_OK);

        return 0;

}

  在我们创建了窗口并作检查以确定我们有一个正确的句柄后我们使用WinMain()最后的参数来显示窗口再更新它以确认它在屏幕上正确地重画了自己

   ShowWindow(hwnd, nCmdShow);
   UpdateWindow(hwnd);

  nCmdShow是可选的参数,你可以简单地传递SW_SHOWNORMAL即可.但是用从WinMain()传来的参数可给予运行此程序的用戶选择以可视,最大化,最小化等选项...来引导程序的自由.你可以在windows快捷方式的属性中看到这些选项,参数由选项来決定.

while(GetMessage(&Msg, NULL, 0, 0) > 0)   

{

        TranslateMessage(&Msg);

        DispatchMessage(&Msg);

}   

        return Msg.wParam;

  GetMessage()从你应用的消息队列中取一个消息.任何时候用戶移动鼠标,敲击键盘,点击你窗口的菜单,或做別的什么事,系统会产生消息并输入到你的程序的消息队列中去.调用GetMessage()时你请求将下一个可用的消息从队列中删除并返回给你来处理.如果队列为空,GetMessage()阻塞.如果你不熟悉这个术语,它意味著一直等待直到得到一个消息,才返回给你.

  TranslateMessage()为键盘事件做一些额外的处理,如随著WM_KEYDOWN消息产生WM_CHAR消息.最后DispatchMessage()将消息送到消息应该被送到的窗口. 可能是我们的主窗口或另外一个,或一个控件,有些情況下是一个被系统或其它程序创建的窗口.这不是你需要担心的,因为我们主要关心我们得到消息并送出,系统来做后面的事以确认它到达正确的窗口.

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
        case WM_CLOSE:
            DestroyWindow(hwnd);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hwnd, msg, wParam, lParam);
    }
    return 0;
}

  窗口过程在每个息到来时被调用一次HWND参数是息相应的窗口的句柄



猜你喜欢

转载自blog.csdn.net/xurui1073337662/article/details/60139735