Timers and Animation

theForger's Win32 API�̵̳ڶ���(��������)

��ҳ

����
  1. ��ʼѧϰ
  2. һ���򵥵Ĵ���
  3. ������Ϣ
  4. ������Ϣѭ��
  5. ʹ����Դ
  6. �˵���ͼ��
  7. �Ի���
  8. ��ģ̬�Ի���
  9. ��׼�ؼ�
  10. �Ի��򳣼�����
����һ����Ӧ��
  1. ������ʱ�����ؼ�
  2. �ļ��볣�öԻ���
  3. ��������״̬��
  4. ���ĵ�����
ͼ���豸�ӿ�
  1. λͼ���豸������
  2. ͸��λͼ
  3. ��ʱ���붯��
  4. �ı����������ɫ
�������ĵ�
  1. �ο�
  2. ��ѵ�Visual C++�����¸��£�
����
  1. ��������Ľ�Q����
  2. API vs. MFC
  3. ������Դ�ļ���˵��

һ���򵥵Ĵ���[images/simple_window.gif]

������simple_window

��

������ʱ��������IRC���ʣ�������ô��ʵ��һ�����ڣ����������Ҿ��ò���һ��������˵���������Ȼһ����������Ҫ��ʲô�󲢲��ѣ��������ȷ��Ҫ��һЩ������ʹ��ʾһ�����ڣ���Щ���鲻������������һ����˵������ģ�

����������ϲ������һ������Ȼ���������������������ȸ���һ���򵥴��ڵĴ����Ժ��������ͣ�
#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;
}
��������˵�������봴��һ��������д����򵥵ij��򣬴�����70�����ҵĴ��룮�����һ��������ͨ���˱��룬���ҲӦ�ò�������.

��һ��:ע�Դ�����

����һ���������ࡡ�洢����һ�����ڵ���Ϣ���������ƴ��ڵĴ��ڹ��������ڵĴ�Сͼ�����Լ������ɫ.�����ַ�ʽ���������ע��һ����������Ȼ���������������Ŀ�Ĵ�����������Ҫһ�δε�ָ����Щ�����������Ҫ���������������Ե����Ĵ���������.

��������˵�Ĵ�������C++�е�������ȫ��ͬ�ĸ���.

const char g_szClassName[] = "myWindowClass";
����ı����洢�����Ǵ���������֣����ϻ�������ϵͳע�Դ����࣮
    WNDCLASSEX wc;
    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;
    }

��������������WinMain()��ע�����ǵĴ�����Ĵ��룮������дһ��WNDCLASSEX�ṹ��ij�Ա������RegisterClassEx()��

�����ṹ��ij�Ա�Դ������Ӱ�����£�
cbSize
�����ṹ��Ĵ�С��
style
�������ʽ��(CS_*)����Ҫ������ʽ��(WS_*)������.���һ������Ϊ0��
lpfnWndProc
����ָ�����������Ĵ��ڹ��̵�ָ�룮
cbClsExtra
�������ø������Ķ���ȴ�.һ��Ϊ0��
cbWndExtra
�������ø�������ÿ�����ڵĶ���ȴ�.һ��Ϊ0��
hInstance
����Ӧ�ó���ʵ���ľ��������WinMain()��һ����������������
hIcon
�������Ñ�����Alt+Tab���ʱ����ʾ�Ĵ�ͼ�꣨һ��Ϊ32*32����
hCursor
���������ǵĴ�������ʾ�Ĺ�꣮
hbrBackground
�����������Ǵ��ڱ����ɫ�ı���ˢ�ӣ�
lpszMenuName
���������Ĵ������õIJ˵���Դ�����֣�
lpszClassName
����������֣�
hIconSm
�������������ʹ��ڵ����Ͻ���ʾ��Сͼ��(һ��Ϊ16*16)��


����������ò��������Ȳ�Ҫ���ģ����ϻ��н��⣮����Ҫ��ס��һ�������Dz�Ҫ��ͼȥ������Щ�������һ����ϲ������������ǽṹ������IJ��������������˷Ѿ����͸���Ҫ��ʱ�䣮�����֪��Ҫ���õĺ������ȥ������������İ����ĵ��в�һ�£�Ҫ�Ǜ]�а����ĵ��������뷨Ū�����]�������Ǻ����Ƶģ�������ʹ�ö�κ�Ҳ������ס��Щ��õĺ����IJ�����

����Ȼ�����ǵ���RegisterClassEx()������Ƿ�ɹ������ʧ�����ǵ���һ����ʾ��Ϣ����WinMain()�����˳�����

�ڶ���:��������

����һ����ע���������Ǽ��ɴ�������һ����������Ӧ��ȥ��һ��CreateWindowEx()�IJ����б�������Ҫ��һ����API��ʱ��������Ҫ������)�������һ������������򵥵Ľ�����

    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������չ�Ĵ���ʽ������������������õ�һ���Ȳ����ݵı߿�Ч������������0����Ч����Ҫϰ�����Բ�ͬ��ֵ��Ч����

���������������������������g_szClassName��������ϵͳ����Ҫ����ʲô���Ĵ�������Ϊ����Ҫ�Ӹո�ע�Ե��ഴ������������ʹ���˸����������֮������ָ�������Ǵ��ڵ����ֻ��DZ�����������ʾ�����Ǵ��ڵ���ۻ��DZ���������

�����������õ�WS_OVERLAPPEDWINDOW��һ������ʽ�������������кܶණ������Բ��Ҳ����������������н����˵����

�������������ĸ�������CW_USEDEFAULT��CW_USEDEFAULT��320��240�������Ǵ��ڵ����Ͻǵ�X��Y���������Ⱥ͸߶����Ұ�X��Y������ΪCW_USEDEFAULT����ϵͳ�Լ�ѡ������Ļ���ĸ��ط������ô�������ס��Ļ������ߵ�X����Ϊ0�����Ҽ�����Ļ�Ķ�����Y����Ϊ0����׼�.��λ��������������Ļ���ض��ķֱ���������ʾ����С��λ��

�����ٽ��������ĸ���NULL��NULL��g_hInst��NULL���քe�Ǹ����ڵľ�����˵������Ӧ�ó���ʵ��������ʹ��ڴ������ݵ�ָ��.��windowsϵͳ��������Ļ�ϵĴ������Էֲ�εĸ��������Ӵ��ڵ���ʽ����֯�������㿴��һ����������һ����ťʱ������ť�����Ӵ������������Ĵ��ھ��Ǹ�����.���ǵ��������������ڵľ��ΪNULL����Ϊ����]�и�����������������ǵ������ڻ��Ƕ��㴰��.�˵�Ҳ��NULL����Ϊ��������Ҳ�]�в˵�.ʵ�������Ϊ���Ǵ�WinMain()�õ��ĵ�һ������.���ڵĴ�������(���Ǽ����]��ʹ��)���������򴴽��Ĵ��ڷ��Ͷ�������������Ҳ��ΪNULL��

�����������֪�������NULL��ʲô����ʵ���ϱ�����Ϊ0(��).������C�������DZ�����Ϊ((void*)0)������Ϊ��������ָ���õ�.�������п����ڰ�NULL������ʹ��ʱ��õ�����������ı������ľ��漶�e�����й�������Ժ������������Ҳ������0��������

�������������Ƿ�ɹ������dz���ԱΪ�Ҳ������򾿾�������������յ����������r��CreateWindow()���ܻ����ʧ������ʹ����һ���þ���ij���Ա��ԭ����ǿ��ܷ�����ĵط�ʵ��̫������������ѧ������ο��ٲ��������������Ӧ�ø��Լ�һ������֪����������˴���һ����ס��鷵��ֵ��

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

���������Ǵ����˴��ڲ��������ȷ��������һ����ȷ�ľ����������ʹ��WinMain()���IJ�������ʾ�������ٸ�������ȷ��������Ļ����ȷ���ػ����Լ���

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

����nCmdShow�ǿ�ѡ�IJ���������Լ򵥵ش���SW_SHOWNORMAL����.�����ô�WinMain()�����IJ����ɸ������д˳�����Ñ�ѡ���Կ��ӣ���󻯣���С����ѡ�������������������ɣ��������windows��ݷ�ʽ�������п�����Щѡ�������ѡ�����Q��.

����������Ϣѭ��

����������������K�������м������еĿ��ƶ�������㴫����

    while(GetMessage(&Msg, NULL, 0, 0) > 0)
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
    return Msg.wParam;

����GetMessage()����Ӧ�õ���Ϣ������ȡһ����Ϣ.�κ�ʱ���Ñ��ƶ���꣬�û����̣�����㴰�ڵIJ˵��������e��ʲô�£�ϵͳ�������Ϣ�����뵽��ij������Ϣ������ȥ������GetMessage()ʱ��������һ�����õ���Ϣ�Ӷ�����ɾ�������ظ������������������Ϊ�գ�GetMessage()����������㲻��Ϥ����������ζ��һֱ�ȴ�ֱ���õ�һ����Ϣ���ŷ��ظ���.

����TranslateMessage()Ϊ�����¼���һЩ����Ĵ�����������WM_KEYDOWN��Ϣ����WM_CHAR��Ϣ�����DispatchMessage()����Ϣ�͵���ϢӦ�ñ��͵��Ĵ���. ���������ǵ������ڻ�����һ������һ���ؼ�����Щ��r����һ����ϵͳ���������򴴽��Ĵ��ڣ��ⲻ������Ҫ���ĵģ���Ϊ������Ҫ�������ǵõ���Ϣ���ͳ���ϵͳ�������������ȷ����������ȷ�Ĵ��ڣ�

���IJ������ڹ���

�������˵��Ϣѭ���dz�������K���Ǹ����ڹ��̾��dz���Ĵ��������������͵����ڵ���Ϣ��������

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��������Ϣ��Ӧ�Ĵ��ڵľ���������Ҫ��Ϊ���������ͬ���ഴ���������������ڲ�����������ͬ�Ĵ��ڹ���(WndProc())����ͬ����ڲ�ͬ�Ĵ����в�ͬ��hwnd�������������ǵõ�WM_CLOSE��Ϣ���Ǿ�Ҫ�����Ǹ�����������ʹ���˴��ھ����Ϊ���ǵõ��ĵ�һ�������������Ĵ��ڶ�������Ӱ���������Ǹ�������Ҫ������֮����

����WM_CLOSE�������ǰ��¹رհ�ť����Alt+F4���ʱ����������Ĭ�ϻ�ʹ��������������ϲ����ʽ����������Ϊ�����ڳ����˳�֮ǰ������������ѯ���Ñ��Ƿ񱣴��ļ�������ľ��ѵ�λ����

���������ǵ���DestoryWindow()ϵͳ��Ҫ�����Ĵ����ͳ�WM_DESTORY��Ϣ�����������ǵĴ��������ڴ�ϵͳ�Ƴ����ǵĴ���֮ǰɾ����ʣ�µ����е��Ӵ�������Ϊ�������ǵij�����Ψһ�Ĵ��������ǜʱ����˲�ϣ�������˳����������ǵ�����PostQuitMessage()������������Ϣѭ������WM_QUIT��Ϣ�����Dz���Զ�ղ��������Ϣ����Ϊ��ʹGetMessage()����FALSE��������Ҳ���Կ������ǵ���Ϣѭ������������ʱ������ֹͣ������Ϣ���������յĽ���������Ǵ��ݸ�PostQuitMessage()��WM_QUIT�е�wParam�������������ֵֻ������ı��Ϊ���e�ij�����ò�������Ҫһ��ȷ���ķ���ֵʱ���������������

���岽���]�е��岽

����Phew����һ�������������ȸ�һ����.������滹�]�н�������Ļ��������ȷ�����Ҳ�������ڽ�������õij���ʱ��Щ������������������

Copyright © 1998-2008, Brook Miles (forgey). All rights reserved.