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. ������Դ�ļ���˵��

λͼ���豸�����ĺ�BitBlt

[images/bmp_one.gif]

������bmp_one

GDI

����MS Windows��DOS�������������Ƚ�ΰ���һ���¾����㲻��֪�����õ�ʲô��ʾӲ���Ϳ�����ʾͼ�Σ���DOS��ͬ���ǣ�Windows�ṩ��һ��API����ͼ���豸�ӿ�(Graphics Device InterFace)�����֮ΪGDI��GDI��һ��ͨ�õ�ͼ�ζ���������Ļ���ȴ������Ǵ�ӡ����ͼ��

�豸������

����GDI��һ�����豸�����ģ�Device Context��DC���ĸ�����ϵ�úܽ��ܣ���HDC�������������������Handle to Device Context���豸�����ĵľ������һ��HDC��ž���һ������������ͼ�ľ���������Դ���������Ļ��һ�����ڵĿ͑�����һ�����ڃȴ��е�λͼ������һ����ӡ�����ȽϺõ�һ���������������Ҫ֪������ָ������������һ�ַ�����ʹ����������д�Զ���Ļ�ͼ����ʱ����Ϳ��԰��������κ������豸��Ϊÿ���豸���޸ģ�

����HDC���������GDI����һ���е���Ӳ������˵�㲻��ֱ�ӷ����������ݣ�������������Խ��䴫�����Բ������ĺܶ�GDI�����������ͼ����ȡ������Ϣ�����������һЩ�޸ģ�

�������磬���������һ�������ϻ�ͼ��������Ҫ��GetDC()����ȡ����������ڵ�HDC��Ȼ����Ϳ������κ���HDCΪ������GDI��������BitBlt()����ͼ��TextOut()��������֣�LineTo()�������ȵȣ�

λͼ

����λͼ������ǰ���½ڵ������е�ͼ��һ����װ�룬��һ��LoadBitmap()����ɴ�����Ļ�����������򵥵�װ��һ��λͼ��Դ������LoadImage()��������һ��*.bmp�ļ�װ��λͼ�������ͼ����һ����

����GDI�и�������ĵط����㲻��ֱ�Ӵ���λͼ����HBITMAP���ͣ���ͼ����ס��ͼ�����Ѿ����豸�����ij�������Ҫ��һ��λͼ�����ͼ��������Ҫ����һ���ȴ�DC��Ȼ����SelectObject()��HBITMAPѡ�����У�����Ч���������HDCָ���''�豸''���ǃȴ��е�λͼ������������HDCʱ������ʵ���������Ǹ�λͼ������Ч��. ���ᵽ�ģ���һ���ܷ���ķ�����ֻҪ���дΪ��һ��HDC��ͼд������Ϳ�����������һ������DC��һ���ȴ�DC�϶�����Ҫ�κεļ��͸Ķ���

�������Լ��Dz��ܲ����ڃȴ��е�λͼ���ݵģ���������豸����λͼ��Device independent Bitmaps��DIB�������������������������԰�GDI��һ��IJ���һ������DIB�ϣ����������Ϊ�Ѿ���������������򵥵Ľ̵̳ķ�Χ������������ֻ���ۼ򵥵�GDI����������

GDIй©

����һ������˶�һ��HDC�IJ������ͷ����Ǻ���Ҫ��(������ô����ȡ�Q��������ô���õ����ģ�����������Ͻ�Ҫ̸��).GDI���������޵�. ��windows95֮ǰ�İ汾�����Dz������������ŵ����޶�����������ϵͳ�й������������һ���������˹���Ļ����e�ij���͸������ܻ��κζ���!���˵������ڵ���r�Ѿ��������ˣ������������Windows2000��XP���úܶ������Դ��ֱ����r��ú���...�����ͷ�GDI�����Ǻ����ױ����ǵģ���Windows 9x����ij�����Ժܿ������GDI��Դ.�����Ͻ���NT(NT/2K/XP)ϵͳ���㲻Ӧ�ÿ��ܰ�ϵͳ��GDI��Դ���꣬���ǻ��Ǵ��ڼ�����r����������Dz������ð�գ�

���������ij����ڸոտ�ʼ�ļ�������������Ȼ��ʼ��ֵػ�ͼ������Ͳ���ͼ�ˣ���ͱ�����ܿ���й©��GDI ��Դ.ֵ����ע��Ҫ�ͷŵ�GDI���󲻽���ֻ��HDC�����ǰ�λͼ������֮�����Դ�ڳ�����������������б���������ǰ�ȫ�ģ���������ÿ����Ҫ��װ��һ��Ҫ��Ч��Щ��

�������У�һ��HDCһ��ֻ�ܱ���һ�����͵Ķ���λͼ�����壬�ʣ�������������ѡ��һ���µĽ�ȥ��ʱ������ԭ���ķ���. �����ش�����������Ǻ���Ҫ��.�������ȫ�������������ڃȴ��жѻ�������GDIй©.��һ��HDC����������Ҳ��ijЩĬ��ѡ�����Ķ���һ�𴴽������������Ƿ��������ʱ����ý����Ǵ������������������HDC��ͼ���Ҫ�����Ǵ��ȥ.�ⲻ����ֻ�ǰ����Լ��Ķ����HDC�h�������Ǹ������飩Ҳ���Խ�Ĭ�ϵĶ�������ط��ڵ����ͷŻ��������HDC��ʱ����Կ����ĵط������Ƿdz��õģ���

��Ҫ���£��������еĶ���Ĭ�ϵ�ѡ��HDC������Կ���MSDN�ҳ���Щ���������ģ���Ϊ����ǰ��ȷ��HBITMAP�Ƿ��������е�һ������Ϊ�������]�й��������ȷ�����ĵ�����������(��ʹ��΢���Լ���)��������Ĭ�ϵ�λͼ.�ԴӼ���ǰԭ���Ľ̳̱�д������ȷ������ʵ���и�Ĭ�ϵ�λͼ��Ҫ�ͷ�.�����Ϣ����Shaun Ivory�ṩ�ģ�һ��΢���Ĺ���ʦ��Ҳ������#winprog�ϵ�һ�����ѣ�

������ʵ��ԭ��΢��д��һ����Ļ����������һ��bug�����������־�����ΪĬ�ϵ�λͼ����]�б���Q������������������������GDI ��Դ�����裡����һ�������׷��Ĵ���

��ʾλͼ

�������ˣ���ʼ̸���£�����һ��������򵥵Ļ�ͼ���������ڶ�WM_PAINT��Ϣ�Ĵ�����.����Ĵ��ڴ���С�����Ǵ�һ���������Ĵ��ڻָ�������ʾ�� Windows����Ĵ��ڷ���WM_PAINT��Ϣ������֪����Ĵ�����Ҫ���»����ă���.��������Ļ�ϻ�ͼʱ�򣬲��������õػ���ȥ��ֻ���������e��ʲô������������֮ǰ���ڣ��������ʵ���ʱ������Ҫ���»�����

HBITMAP g_hbmBall = NULL;
    case WM_CREATE:
        g_hbmBall = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(IDB_BALL));
        if(g_hbmBall == NULL)
            MessageBox(hwnd, "Could not load IDB_BALL!", "Error", MB_OK | MB_ICONEXCLAMATION);
    break;

��������Ҫ���ĵ�Ȼ��װ��λͼ������һ��λͼ��Դ��˵��ܼ򵥣���װ��������ʲô��Դ�]��ʲô�ܴ�IJ.Ȼ�����ǿ�ʼ��ͼ������

    case WM_PAINT:
    {
        BITMAP bm;
        PAINTSTRUCT ps;

        HDC hdc = BeginPaint(hwnd, &ps);

        HDC hdcMem = CreateCompatibleDC(hdc);
        HBITMAP hbmOld = SelectObject(hdcMem, g_hbmBall);

        GetObject(g_hbmBall, sizeof(bm), &bm);

        BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCCOPY);

        SelectObject(hdcMem, hbmOld);
        DeleteDC(hdcMem);

        EndPaint(hwnd, &ps);
    }
    break;

��ȡ����DC

�����ڿ�ʼ��ʱ�����Ƕ���һЩ������ע���һ����һ��λͼ��������һ��HBITMAP��BITMAP��һ������ʵ�ʵ�GDI����HBITMAP���й���Ϣ��һ���ṹ�壮������Ҫһ�ֵõ�HBITMAP�ĸ߶ȺͿ��ȵķ�������������ʹ��GetObject()��������������������෴���������������ػ�ȡһ�����󣬶��ǻ�ȡһ���Ѿ����ڵĶ���������Ϣ.����ǡ�GetObjectInfo��������ֻ���ǡ��Щ.GetObject()���ԶԲ�ͬ�����GDI����ʹ�ã��������ͨ���ڶ������������ṹ��Ĵ�С�����ֵģ�

����PAINTSTRUCT��һ���ṹ�壬������Ҫ��ͼ�Ĵ��ں�Ҫʵ�ʻ�ͼ�ă�����ص���Ϣ.���ڴ�����򵥵���������Լ򵥵غ�������������Ϣ��������BeginPaint()ʱҪ�õ���.BeginPaint()�����������ͬ��������һ�����������������WM_PAINT��Ϣ��.�����Ǵ���һ��WM_PAINT��Ϣ��ʱ�������ʹ��GetDC()������������ϻ������ǵĶ�ʱ���������п���...������WM_PAINT��Ϣ�Ĵ����У�BeginPaint()��EndPaint()��ʹ���Ǻ���Ҫ�ģ�

����BeginPaint()�����Ƿ���һ��HDC���������Ǵ�������HWND������WM_PAINT��Ϣ���������Ǹ����.���Ƕ����HDC�������κβ�������������Ļ����ʾ������

Ϊλͼ����һ���ȴ�DC

������ͬ���������ᵽ�ģ�Ϊ����λͼ�ϻ���λͼ����ͼ������Ҫ�ڃȴ��д���һ��DC������������򵥵ķ�������CreateCompatibleDC()�������Ѿ��е��Ǹ�������.���������Ǿͻ�õ�һ�������ǵĴ��ڵ�HDC���ɫ��Ⱥ���ʾ��������ݵăȴ�DC��

�����������ǵ���SelectObject()�����λͼѡ�����DC����С�ĵش洢Ĭ�ϵ�λͼ�������Dz����ں�������Q��ʱ������GDI����й©��

��ͼ

����һ�����ǽ����λͼ�Ĵ�С�õ������뵽BITMAP�ṹ����ȥ�����ǾͿ��Ե���BitBlt()�������ͼ��Ӄȴ�DC����������DC��ȥ��������Ļ����ʾ. �����ϻ����������MSDN�в�����ÿ�����������򵥵ؽ��������ǣ�Ŀ�꣬λ�����С��Դ��Դλ�ã��������դ����(Raster Operation��ROP����)����������ָ���������Ƶ�.�ڱ���������ֻ��򵥵ذ�Դ���и��ƣ����㻨����ڣ�

����BitBlt()����������Win32 API����Happy��һ���������κ�����Windows��д���[Ϸ���DŽe��ͼ��Ӧ�õ��˶���ϲ������Ҳ�������ҵ�һ����ס�����еIJ�����API������

���

�������ʱ��λͼӦ���Ѿ�����Ļ���ˣ�����Ҫ�Լ�������๤��.Ҫ���ĵ�һ�������ǰуȴ�DC�ָ������ǻ�ȡ��ʱ���״̬����˼����Ҫ�����Ǵ洢��Ĭ�ϵ�λͼ����Q���ǵ�λͼ.��һ���Ϳ�����DeleteDC()��������һ���h����

�������������EndPaint()���ͷŴ�BeginPaint()�õ��Ĵ���DC��

��������һ��HDC��ʱ�е������Ի���Ϊ�����������ķ�ʽ�����������ַ�����������������

����������һЩ���õĻ�ȡһ��DC����������ʹ�����ͷŵķ�����

��GetDC() -- ReleaseDC()

��BeginPaint() -- EndPaint()

��CreateCompatibleDC() -- DeleteDC()

������������dz�����ֹ��ʱ����������������õ����е���Դ�ͷŵ�.�Ӽ����Ͻ��ⲻ�ǽ^�Ե���Ҫ����Ϊ�ִ���Windowsƽ̨����ij�����ֹ��ʱ���Ѿ����Ժ����ܵذ�������ж����ͷŵ������ǰ����Լ��Ķ����������Ǻ��кô��ģ���Ϊ�����͵����ȥ�h�����ǣ����ǵ�ϰ�߾ͻ��ú���ɢ�����Һ������ɵģ�������һЩ�ϵİ汾��Windows�л��кܶ��bug����������ȫ������GDI����������Լ��������һ��Ļ���

    case WM_DESTROY:
        DeleteObject(g_hbmBall);
        PostQuitMessage(0);
    break;

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