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/bmp_two.gif]

������bmp_two

͸��

������λͼ����͸��Ч���ܼ򵥣���������Ҫ��ʾ͸��Ч���IJ�ɫͼ���⣬��Ҫ�õ����ĺڰ�ɫ����ͼ��

����������Ҫ��ȷ��ʾ���ǵ�����Ч������������һ����ɫ��ͼ�������Ҫ��ʾΪ͸���ĵط�Ҫ���Ǻ�ɫ�ģ���Σ���ͼ������Ҫ��ʾΪ͸��Ч���ĵط�Ҫ���ǰ׵ģ����������ĵط����Ǻ�ɫ�ģ���ɫͼ���������ͼ����ͼ�е��������ʾ��

BitBlt����

����������ô������͸��Ч���ģ��������ǽ�BitBlt()�����һ��������ΪSRCAND����ʾ��ͼ��Ȼ���ٰ�����ΪSRCPAINT��BitBlt()����ʾ��ͼ.�������������Ҫ͸���ĵط����]�иı�������ĵط���ͨ��һ����ʾ.

    SelectObject(hdcMem, g_hbmMask);
    BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCAND);

    SelectObject(hdcMem, g_hbmBall);
    BitBlt(hdc, 0, bm.bmHeight, bm.bmWidth, bm.bmHeight, hdcMem, 0, 0, SRCPAINT);

�����൱�򵥰�?�е����ˣ������и�����...��ͼ��������?��������������������ȡ��ͼ...

�������㴴����ͼ�Ļ�ͼ�������Լ�����������ʹ�õò���Ļ�������Ҳ�Ǻ�����.�����Ļ���Ͱ��㴴������ͼ������Դ����LoadBitmap()��װ����.

������������е�ʱ��������������ԭ����ͼƬ�е�һ���ɫѡΪ''͸��''ɫ������һ�������ɫ���ڵĵط�Ϊ��ɫ�ģ������ĵط���Ϊ��ɫ��ͼƬ.

������Ϊ��һ�ַ����]��ʲô����˵�ģ������Ը��Ļ��Ϳ��Ԓ�ȡ���ַ���.�ڶ���ǣ��һЩBitBlt()�ļ��ɣ�����������ʾһ�����ַ���.

������ͼ

������򵥵ķ��������DZ�����ͼ�е�ÿ�����أ��������ֵ������Ӧ��������Ϊ��ͼ�еĺڻ��...����SetPixel()��ͼ����������������Ҳ�Dz�̫ʵ��.

������BitBlt()���Ѳ�ͼתΪ�ڰ�ɫ����Ч�ʵö�.�������BitBlt()����SRCCOPY�����ѱ�����һ����ͼ��HDCд��һ��������һ���ڰ�ͼƬ��HDC�����ͻ����ͼ����Ϊ����ɫ���ɫ�����������ɫ�����ض���Ϊ�ף��κβ��DZ���ɫ���������ض�����Ϊ��ɫ.

�������������˵�Ǹ��ܺõĹ��ܣ���Ϊ������Ҫ���ľ��ǰ����Dz�ͼ��Ҫ͸��Ч�����ɫָ��Ϊ����ɫ�����Ѳ�ͼ��BitBlt()�Ӳ�ͼ������ͼ������.ע����ֻ�ܶԵ�ɫ����ͼ��Ч���ںͰף�...����˵ÿ�����ص��ɫ���Ϊ1��bit��λͼ.������һ��ֻ�кڰ����صIJ�ͼ��������������λͼ����ȴ���1 ��bit(����16����24bit)�Ͳ���.

������ס���������Ҫ�ɹ�����Ҫ�����]��?��������Ҫ͸��Ч���ĵط���Ҫ�Ǻ�ɫ��.��Ϊ�������ڴ�����λͼ�Ѿ�������������ˣ�����Ҫ������ô�����ˣ���������������Ĵ�����������һ��λͼ��ʹһ����ͬ���ɫΪ͸��Ч����һ���Ƿۺ�ɫ�������Ǿ�Ҫ���еڶ����IJ��������������Ǹոմ�������ͼ����ԭͼ��һ�㣬��ʹ����Ҫ͸��Ч���ĵط���Ϊ��ɫ.�e��ʲô�ط�Ҳ�Ǻ�ɫҲ��Ҫ������Ϊ��ͼ�����Dz��ǰ�ɫ�ģ����ǾͲ���Ϊ͸����.���ǿ�����BitBlt()����SRCINVERT���������µ���ͼд��ԭ��ͼ����������ͼ��Ϊ��ɫ�ĵط���Ϊ��ɫ.

������������е㸴�ӣ����Ծ���һ��С������Ϊ����������������������:

HBITMAP CreateBitmapMask(HBITMAP hbmColour, COLORREF crTransparent)
{
    HDC hdcMem, hdcMem2;
    HBITMAP hbmMask;
    BITMAP bm;

    // Create monochrome (1 bit) mask bitmap.  

    GetObject(hbmColour, sizeof(BITMAP), &bm);
    hbmMask = CreateBitmap(bm.bmWidth, bm.bmHeight, 1, 1, NULL);

    // Get some HDCs that are compatible with the display driver

    hdcMem = CreateCompatibleDC(0);
    hdcMem2 = CreateCompatibleDC(0);

    SelectBitmap(hdcMem, hbmColour);
    SelectBitmap(hdcMem2, hbmMask);

    // Set the background colour of the colour image to the colour
    // you want to be transparent.
    SetBkColor(hdcMem, crTransparent);

    // Copy the bits from the colour image to the B+W mask... everything
    // with the background colour ends up white while everythig else ends up
    // black...Just what we wanted.

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

    // Take our new mask and use it to turn the transparent colour in our
    // original colour image to black so the transparency effect will
    // work right.
    BitBlt(hdcMem, 0, 0, bm.bmWidth, bm.bmHeight, hdcMem2, 0, 0, SRCINVERT);

    // Clean up.

    DeleteDC(hdcMem);
    DeleteDC(hdcMem2);

    return hbmMask;
}

ע�⣺�����������SelectObject()����ʱ�ذ����Ǵ���һ��HDC��λͼѡ�룮һ��λͼ����ͬʱ��ѡ����HDC������Ҫȷ�����λͼ����������������ʱ��]�б�ѡ������һ��HDC������ͻ����.������������ɰ���С���������Ǿ�װ��һ��ԭͼ��ʱ�������ϾͿ��Դ���һ����ͼ�ˣ�

    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);

        g_hbmMask = CreateBitmapMask(g_hbmBall, RGB(0, 0, 0));
        if(g_hbmMask == NULL)
            MessageBox(hwnd, "Could not create mask!", "Error", MB_OK | MB_ICONEXCLAMATION);
    break;

�����ڶ���������Ȼ������Ҫ��ԭͼ����ʾΪ͸��Ч�����ɫ������ط�Ϊ��ɫ.

��Щ����ô�����İ�?

����...����ܻ�����仰������������ô�õ�C����C++����Ļ�����Ӧ����Ϥ��Щ�����ƵIJ�����OR��XOR��AND��NOT�ȵ�.�Ҳ�������ȫ������Щ������������Ҫ˵˵����������������������ǵ�.����ҵĽ��Ͳ������(�������������)��ȥ��ϰһ�¶����Ʋ�����֪ʶ���ܾ�������.���ⲻ������ʹ�����ǵı�Ҫ���������������ȫ����������Ҳ�����Թ�������һ��.

SRCAND

����BitBlt()��SRCAND��Ų������ΪROP������ζ����AND�����λ.����˵:ֻ��Դ��Ŀ�ĵ�λ����1�����Ϊ1.��������������������ǵIJ�ͼ�е���Щ���ɫ��������ͼ�ж���Ϊ��ɫ.����Ҫ�ɫ�ĵط�����ͼ�ж��Ǻ�ɫ(�ڶ������϶�Ϊ0)��Ȼ����ͼ�����е�Ϊ��ɫ�������ڽ���б���Ϊ0������Ҳ�Ǻ�ɫ.������AND��1������ֵ��������Ӱ�죬���ԭ����1�͵ó�1��ԭ����0�͵ó�0 ...�������ǵ���ͼ��Ϊ��ɫ�IJ�����BitBlt()����֮����ȫ�]�б�Ӱ��. �����������ͼƬ�е����Ͻǵ��Ǹ�ͼ��

SRCPAINT

����SRCPAINT���õ�OR�����������������֮һ�����߶�Ϊ1��������Ϊ1. ���ǶԲ�ͼ�����������. �����ǵIJ�ͼ�ĺ�ɫ����(͸������)��OR����Ŀ��������ϣ�������Ǜ]��Ӱ�죬��Ϊ�κ�ֵ��0����OR����������᲻��Ӱ�죮

�������ǣ����Dz�ͼ���������ֲ��Ǻ�ɫ�ģ����Ŀ������Ҳ���Ǻ�ɫ�ģ����Ǿ͵õ�Դ��Ŀ��ɫ�ʵĻ�ϣ����������������ͼƬ�ڶ��еĵڶ�����.�������������Ҫ����ͼ������Ҫ��Ϊ��ɫ�ĵط���Ϊ��ɫ��ȫ�����ɣ�����������OR��������ͼʱ����ɫ�����ز�����κ����������ػ�ϣ�

SRCINVERT

������������������Դ��ͼ�е�Ҫ͸��Ч���ĵط���Ϊ��ɫ��XOR����(������Ǻ�ɫ�Ļ�).����ͼ�еĺ�������Ŀ��������϶�Ŀ�����ز������κ�Ӱ�죬������ͼ�еİ�ɫ���أ�������һ���ض��ı���ɫ�����ɵģ��뱳��ɫ����������Ͼͻ����ȡ������������Ϊ��ɫ��

���������һ����ڲ�ͼ�뵥ɫ�IJ�����Ϸ�����ҵ�ͷ��ö��е�ʹ�ˣ�������ô˵��������������ģ�����˵��ģ�

����

������������ϵ�bmp_two�����е�������������˿��Ի�����¿�ʼ������ͼƬ�ij���������SRCCOPY��������ͼ��ԭ��ͼԭ�����������ٷքe��SRCAND��SRCPAINT������ͼƬ�������������Ǻϳ����ս����

�����������аѱ���ɫ��Ϊ��ɫ��ʹ͸��Ч�������ԣ�Ҫ���ð�ɫ���Ǻ�ɫ������ɫ�Ļ��ͺ��ѿ������Ƿ��������Ч����

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