�������� Linux Tags

12. ������

Microsoft Windows���������������ϴ�һ����ʽ���͵���һ����ʽ�С�����ԭ����Զ��ԱȽϼ򵥣������ϴ�ŵ��������ϵij�ʽ��Ӽ�������ȡ�����ϵij�ʽ������̫��ĸ�����Windows 98��Microsoft Windows NT���ṩ�˼����������ʽ���ó�ʽ������ʾ��������Ŀǰ���ݡ�

���ദ�����������������ϵij�ʽ������һ����Edit�����ܱ������а�����Cut������Copy���͡�Paste��ѡ���ʹ����ѡ��Cut�����ߡ�Copy��ʱ����ʽ�����ϴ��͸����������������ʹ��ij�ָ�ʽ�������֡�����ͼ��һ�ְ�λԪ���еľ������У����е�λԪ��ƽ����ʾ��ͼ�����Ӧ������metafile���ö���λԪ��ֵ���ݱ�ʾ�Ļ�ͼ������ȡ���ʹ���ߴӹ��ܱ���ѡ��Paste��ʱ����ʽ���������а��������ϣ�����ʹ�õ��Ƿ��dz�ʽ���Խ��ܵ�һ�ָ�ʽ������ǣ���ô���Ͻ��Ӽ��������͵���ʽ�С�

���ʹ���߲�������ȷ��ָ���ʽ�Ͳ��ܰ�����������Ƴ������������磬��ij����ʽ��ִ�м��»��ƣ����߰�Ctrl-X��Ctrl-C��������ʹ���ߣ�Ӧ���ܹ��ٶ����Ͻ������ڼ������ϣ�ֱ���´μ��»��Ʋ���Ϊֹ��

����һ�µ�ʮ�͵�ʮһ����ʾ��POPPAD��ʽ���޶����У����Ǽ����ˡ�Edit�����ܱ����������DZ��⹦�ܱ�������ֻ�Ƿ���ѶϢ���༭��������ѡ���������£������������������㣬�������Լ����м��������亯ʽ��

���¼������۽����ִ�����Ƴ�����������������½���ҽ�����չʾ����ü�������������ͼ����ʮ�ġ�ʮ���ʮ���£���metafile����ʮ���£���

�������ļ�ʹ��
��

�����ɷ��������ϴ��͵������������»��ƣ��ʹ�ȡ���������ϣ�ճ�����ij�ʽ�뿪ʼ��

��׼���������ϸ�ʽ
��

Windows֧Ԯ��ͬ��Ԥ�ȶ����������ʽ����Щ��ʽ��WINUSER.H�������CFΪ���׵�ʶ���֡�

���Ƚ��������ܹ������ڼ������ϵ�����������̬���Լ�һ�����������ʽ��ص�������̬��

  •  CF_TEXT ï¿½ï¿½NULL���ANSI��Ԫ���ִ�������ÿ��ĩβ����һ��carriage return��linefeed��Ԫ��������òµ¥µÄ¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï¸ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½Íµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ð£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ã¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Å½ï¿½ï¿½Ð´ï¿½ï¿½ÍµÄ£ï¿½ï¿½Ò½ï¿½ï¿½ï¿½Ìµï¿½ï¿½ï¿½ï¿½Û´ï¿½ï¿½ï¿½ï¿½ï¿½î£©ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½Ã£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä³ï¿½Ê½ï¿½ï¿½Ó¦ï¿½Ã¼ï¿½ï¿½ï¿½Ê¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    ��
  •  CF_OEMTEXT ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï£ï¿½ï¿½ï¿½CF_TEXT���ƣ��ļ�����顣������ʹ�õ���OEM��Ԫ����ͨ��Windows��ʽ���ع�����һ�㣻��ֻ�������Ӵ���ִ��MS-DOS��ʽһ��ʹ�ü�����ʱ�Ż�ʹ�á�
    ��
  •  CF_UNICODETEXT ï¿½ï¿½ï¿½ï¿½Unicode���ֵļ�����顣��CF_TEXT���ƣ�����ÿһ�е�ĩβ����һ��carriage return��linefeed��Ԫ���Լ�һ��NULL��Ԫ������0λԪ�飩�Ա�ʾ���Ͻ�����CF_UNICODETEXTÖ»Ö§Ô®Windows NT��
    ��
  •  CF_LOCALE Ò»ï¿½ï¿½ï¿½ï¿½ï¿½Òµï¿½ï¿½ï¿½Ê¶ï¿½ï¿½ï¿½ÖµÄ´ï¿½ï¿½Å¡ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¹ï¿½ÃµÄ¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½è¶¨ï¿½ï¿½
    ��

���������ָ��ӵļ�������ʽ�������ڸ�������CF_TEXT��ʽ���ƣ�Ҳ����˵�����Ƕ����������ϣ����������Dz���Ҫ��NULL��β����Ϊ��ʽ�Ѿ����������ϵĽ�β�������Ѿ�����ʹ����Щ��ʽ�ˣ�

  •  CF_SYLK ï¿½ï¿½ï¿½ï¿½Microsoft ���������᡹���ϸ�ʽ�����������顣���ָ�ʽ����Microsoft��Multiplan��Chart��Excel��ʽ֮�佻�����ϣ�����һ��ASCII���ʽ��ÿһ�ж���carriage return��linefeed���
    ��
  •  CF_DIF ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ï½ï¿½ï¿½ï¿½ï¿½ï¿½Ê½(DIF)֮���ϵ����������顣���ָ�ʽ����Software Arts��˾����ģ���춰������͵�VisiCalc�������ʽ�С���Ҳ��һ��ASCII���ʽ��ÿһ�ж�ʹ��carriage return��linefeed���
    ��

�������ּ�������ʽ�����ͼ�йء���ν����ͼ��������λԪ�ľ������У����е�����λԪ������豸��ͼ�����Ӧ����ʮ�ĺ͵�ʮ���½���ϸ���۵���ͼ�Լ���Щ����ͼ�������ĸ�ʽ��

  •  CF_BITMAP ï¿½ï¿½×°ï¿½ï¿½ï¿½ï¿½ØµÄµï¿½ï¿½ï¿½Í¼ï¿½ï¿½Ê½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½ï¿½ï¿½Å´ï¿½ï¿½Í¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¡ï¿½Í¬ï¿½ï¿½ï¿½ï¿½ï¿½Ú°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½ï¿½ï¿½Í¸ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ö®ï¿½á£¬ï¿½ï¿½Ê½ï¿½ï¿½Ó¦ï¿½ï¿½ï¿½Ù¼ï¿½ï¿½ï¿½Ê¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Í¼ï¿½ï¿½
    ��
  •  CF_DIB ï¿½ï¿½ï¿½ï¿½Ò»ï¿½ï¿½×°ï¿½ï¿½ï¿½Þ¹Øµï¿½ï¿½ï¿½Í¼ï¿½ï¿½ï¿½Úµï¿½Ê®ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¼ï¿½ï¿½ï¿½ï¿½ï¿½é¡£ï¿½ï¿½ï¿½Ö¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ôµï¿½ï¿½ï¿½Í¼ï¿½ï¿½Ñ¶ï¿½á¹¹ï¿½ï¿½Ê¼ï¿½Ä£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ãµï¿½ï¿½ï¿½É«ï¿½ï¿½ï¿½Íµï¿½ï¿½ï¿½Í¼ï¿½ï¿½ï¿½ï¿½Î»Ôªï¿½ï¿½
    ��
  •  CF_PALETTE ï¿½ï¿½É«ï¿½Ì´ï¿½ï¿½Å¡ï¿½ï¿½ï¿½Í¨ï¿½ï¿½ï¿½ï¿½CF_DIB���ʹ�ã��Զ�����װ����صĵ���ͼ��ʹ�õ���ɫ��ɫ�̡�
    ��

�ڼ������У����п����Թ�ҵ��׼��TIFF��ʽ����ĵ���ͼ���ϣ�

  •  CF_TIFF ï¿½ï¿½ï¿½Ð±ï¿½ï¿½Í¼ï¿½ñµµ°ï¿½ï¿½ï¿½Ê½(TIFF)���ϵ����������顣���ָ�ʽ��Microsoft��Aldus��˾��Hewlett-Packard��˾�Լ�һЩӲ�峧���Ƽ�ʹ�á���һ��ʽ�ɴ�Hewlett-Packard����վ�ϻ�á�
    ��

����������metafile��ʽ���ҽ��ڵ�ʮ������ϸ���ۡ�һ��metafile����һ���Զ���λ��ʽ����Ļ�ͼ�����

  •  CF_METAFILEPICT ï¿½Ô¾Éµï¿½metafile��ʽ��ŵġ�ͼƬ����
    ��
  •  CF_ENHMETAFILE ï¿½ï¿½Ç¿ï¿½ï¿½metafile��32λԪWindows֧Ԯ�ģ����š�
    ��

������ܼ�������͵ļ�������ʽ��

  •  CF_PENDATA ï¿½ï¿½Windows�ı�ʽ�������书������ʹ�á�
    ��
  •  CF_WAVE ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Î£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    ��
  •  CF_RIFF Ê¹ï¿½ï¿½ï¿½ï¿½Ô´ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê½ï¿½ï¿½Resource Interchange File Format���Ķ�ý�����ϡ�
    ��
  •  CF_HDROP ï¿½ï¿½ï¿½Ï·Å·ï¿½ï¿½ï¿½ï¿½ï¿½ØµÄµï¿½ï¿½ï¿½ï¿½Ð±ï¿½ï¿½ï¿½
    ��

����������
��

��ʽ�����������һЩ���ϵ�ʱ�򣬱�������һ��������飬���ҽ��������彻���������������ڱ������ڵij�ʽ����Ҫ���ü�����ʱ������ֻ��ʹ�ñ�׼Cִ��ʱ�ڳ�ʽ����֧Ԯ��malloc��ʽ�����ǣ������Windows��ִ�е�Ӧ�ó�ʽ֮�����Ҫ���ü�����������ļ�����飬��ʱmalloc��ʽ����Щ���������������ˡ�

ʵ���ϣ����DZ��������Windows�������ļ��������ú�ʽ���ó���ʹ�ã���ʱ����ҵϵͳ��16λԪ��ʵ��ģʽ������ṹ��ִ�С����ڵ�Windows��Ȼ֧Ԯ��Щ��ʽ����������ʹ�����ǣ������DZ���ʹ����Щ��ʽ�����ˡ�

Ҫ��Windows API������һ��������飬���Ժ��У�

hGlobal = GlobalAlloc (uiFlags, dwSize) ;

�˺�ʽ������������һϵ�п��ܵ����ͼ�������λԪ���С����ʽ����һ��HGLOBAL��̬�Ĵ��ţ���Ϊ��������������š���������š�������ֵΪNULL��ʾ���������㹻�ļ����塣

��ȻGlobalAlloc�������������в�ͬ�������Ƕ���32λԪ�����������������������һ�������趨Ϊ0����ô���Ϳ��Ը���Ч��ʹ�����GMEM_FIXED������������£�GlobalAlloc���ص��������ʵ����ָ�������ü�������ָ�ꡣ

�����ϲ������������е�ÿһλԪ����ʼ��Ϊ0����ô��Ҳ�ܹ�ʹ�����GMEM,_ZEROINIT����Windows��ͷ�����У�����GPTR��궨��ΪGMEM_FIXED��GMEM_ZEROINIT������ϣ�

#define GPTR (GMEM_FIXED | GMEM_ZEROINIT)

������һ���������ú�ʽ��

hGlobal = GlobalReAlloc (hGlobal, dwSize, uiFlags) ;

���������������ˣ���������GMEM_ZEROINIT��꽫�µ�λԪ����Ϊ0��

�����ǻ�ü�������С�ĺ�ʽ��

dwSize = GlobalSize (hGlobal) ;

�ͷż������ĺ�ʽ��

GlobalFree (hGlobal) ;

������16λԪ��Windows�У���ΪWindows������ʵ����������ƶ�������飬���Խ�ֹʹ��GMEM_FIXED��ꡣ��32λԪ��Windows�У�GMEM_FIXED���ܳ�����������Ϊ��������һ������λַ��������ҵϵͳҲ�ܹ�ͨ���ı������ҳӳ�����ʵ����������ƶ�������顣���Ϊ16λԪ��Windowsд��ʽʱ��GlobalAlloc�Ƽ�ʹ��GMEM_MOVEABLE��ꡣ��Windows�ı�ͷ�����л�������һ����дʶ���֣��ô�ʶ���ֿ����ڿ��ƶ��ļ�����֮����0��

#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)

GMEM_MOVEABLE�������Windows��������������ƶ�һ��������顣�ⲻ��˵����ʵ����������ƶ�������飬ֻ��Ӧ�ó�ʽ��춶�д���������λַ���Ա��䶯��

����GMEM_MOVEABLE��16λԪWindows��ͨ�򣬵����������������Ѿ��ٵö��ˡ��������Ӧ�ó�ʽƵ�������á����������Լ��ͷŲ�ͬ��С�ļ�����飬Ӧ�ó�ʽ������λַ�ռ佫����֧�����顣��������õ����������������λַ�ռ�ͻᱻ���ꡣ������Ǹ����ܻᷢ�������⣬��ô����ϣ���������ǿ��ƶ��ġ�����ͽ�������ü�������Ϊ�ɰ���λ�õġ�

���ȶ���һ��ָ�꣨���磬һ��int��̬�ģ���һ��GLOBALHANDLE��̬�ı�����

int * p ;
		GLOBALHANDLE hGlobal ;

Ȼ�����ü����塣���磺

hGlobal = GlobalAlloc (GHND, 1024) ;

�봦������Windows����һ���������ص������ֵ�ʵ�����壬ֻҪ�������ͺ��ˡ���Ҫ��ȡ�������ʱ�����Ժ��У�

p = (int *) GlobalLock (hGlobal) ;

�˺�ʽ������ת��Ϊָ�ꡣ�ڼ�����鱻�����ڼ䣬Windows���̶�����������е�λַ�������ƶ��ǿ�����塣��ȡ��������У�

GlobalUnlock (hGlobal) ;

�⽫ʹWindows������������������ƶ�������顣Ҫ����ȷ���˳���������������������Windows��ʽд���ߵ�ʹ�ྭ��������Ӧ���ڵ�һ��ѶϢ�����ڼ������ͽ���������顣

���ͷż�����ʱ������GlobalFreeӦʹ�ô��Ŷ�����ָ�ꡣ��������ڲ��ܴ�ȡ���ţ�����ʹ������ĺ�ʽ��

hGlobal = GlobalHandle (p) ;

�ڽ���֮ǰ�����ܹ��������һ��������顣Windows����һ�����������������ڼ������ɱ������ƶ�֮ǰ��ÿ����������Ҫ���Ӧ�Ľ�������Windows��������������ƶ�һ���������ʱ������Ҫ��λԪ���һ��λ�ø��Ƶ���һ����ֻ������ش���������ҳӳ�����ͨ������32λԪWindowsΪ���ij�ʽ���ÿ��ƶ��ļ�����飬��Ψһȷʵ������ֻ�DZ������������Ŀռ����ѳ��֡�ʹ�ü�����ʱ��ҲӦ��ʹ�ÿ��ƶ������塣

Ϊ���������ü�����ʱ����Ӧ����GMEM_MOVEABLE��GMEM_SHARE������GlobalAlloc��ʽ��GMEM_SHARE���ʹ������Ӧ�ó�ʽҲ����ʹ���ǿ�����塣

�����ִ��͵�������
��

�����������һ��ANSI�ִ����͵��������ϣ����������Ѿ�����ָ������ִ���ָ��(pString)������ϣ����������ִ���iLength��Ԫ����Щ��Ԫ������NULL��β��Ҳ���ܲ���NULL��β��

���ȣ�ͨ��ʹ��GlobalAlloc������һ�����Դ����ִ��ļ�����飬���л�����һ����ֹ��ԪNULL��

hGlobal = GlobalAlloc (GHND | GMEM_SHARE, iLength + 1) ;

���δ�����õ�������飬hGlobal��ֵ��ΪNULL ��������óɹ����������������壬���õ�ָ������һ��ָ�꣺

pGlobal = GlobalLock (hGlobal) ;

���ִ����Ƶ���������У�

for (i = 0 ; i < wLength ; i++)
     *pGlobal++ = *pString++ ;

���GlobalAlloc��GHND�����ʹ������������������ڼ䱻���Ϊ�㣬���Բ���Ҫ���ӽ�β��NULL ����������Ϊ������������

GlobalUnlock (hGlobal) ;

���ھ����˱�ʾ��NULL��β���������ڼ������ļ�������š�Ϊ�˰����͵��������У��򿪼�������������գ�

OpenClipboard (hwnd) ;
EmptyClipboard () ;

����CF_TEXTʶ���ְѼ�������Ž������������رռ�������

SetClipboardData (CF_TEXT, hGlobal) ;
CloseClipboard () ;

������һ���䡣

�����ǹ�춴˹��̵�һЩ����

  • �ڴ���ͬһ��ѶϢ�Ĺ����к���OpenClipboard��CloseClipboard������Ҫʱ����Ҫ�ò¿ª¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
    ��
  • ��Ҫ�������ļ�������Ž�����������
    ��
  • ������SetClipboardData�ᣬ�벻Ҫ�ټ���ʹ�øü�����顣���������ʹ���߳�ʽ������Ѵ��ſ�������Ч�ġ������Ҫ������ȡ���ϣ������������ϵĸ�������Ӽ������ж�ȡ�������½�����������Ҳ������SetClipboardData���к�CloseClipboard����֮�����ʹ�ü�����飬���Dz�Ҫʹ�ô��ݸ�SetClipboardData��ʽ��������š���ʵ�ϣ��˺�ʽҲ����һ��������ţ�����������Щ�����Դ�ȡ�����塣�ں���CloseClipboard֮ǰ��Ӧ��Ϊ�˴��Ž�����
    ��

�Ӽ�������ȡ������
��

�Ӽ�������ȡ������ֻ�Ȱ����ִ��͵�����������΢����һЩ������������ȷ���������Ƿ���CF_TEXT��ʽ�����ϣ���򵥵ķ����Ǻ���

bAvailable = IsClipboardFormatAvailable (CF_TEXT) ;

����������Ϻ���CF_TEXT���ϣ������ʽ������TRUE�����㣩�������ڵ�ʮ�µ�POPPAD2��ʽ����ʹ���������ʽ��������ȷ����Edit�����ܱ��С�Paste�����DZ����û��DZ�ͣ�õġ�IsClipboardFormatAvailable���������������ȴ򿪼������Ϳ���ʹ�õļ�������ʽ֮һ�����ǣ������֮�����ٴ򿪼�������ȡ��������֣���Ӧ������һ�μ�飨ʹ��ͬ���ĺ�ʽ���������������Ա�ȷ��CF_TEXT�����Ƿ���Ȼ���ڼ������С�

Ϊ�˴��ͳ����֣����ȴ򿪼�������

OpenClipboard (hwnd) ;

��õ��������ֵļ��������ţ�

hGlobal = GetClipboardData (CF_TEXT) ;

���������������CF_TEXT��ʽ�����ϣ��˴��ž�ΪNULL������ȷ���������Ƿ������ֵ���һ�ַ��������GetClipboardData����NULL����رռ����������������κι�����

��GetClipboardData�õ��Ĵ��Ų������ʹ���߳�ʽ������춼�����������GetClipboardData��CloseClipboard����֮��������Ų���Ч���������ͷ�������Ż�����������õ����ϡ������Ҫ������ȡ��Щ���ϣ�������������������ĸ�����

������һ�ֽ����ϸ��Ƶ�ʹ���߳�ʽ�еķ��������ȣ�����һ������������Ͽ��С��ͬ�ļ�����飬������һ��ָ��ÿ��ָ�꣺

pText = (char *) malloc (GlobalSize (hGlobal)) ;

�ٴκ���hGlobal ����hGlobal�Ǵ�GetClipboardData���д��ص�������š������������ţ����һ��ָ����������ָ�꣺

pGlobal = GlobalLock (hGlobal) ;

���ھͿ��Ը��������ˣ�

strcpy (pText, pGlobal) ;

���ߣ�������ʹ��һЩ�򵥵�C��ʽ�룺

while (*pText++ = *pGlobal++) ;

�ڹرռ�����֮ǰ�Ƚ���������飺

GlobalUnlock (hGlobal) ;
CloseClipboard () ;

����������һ������pText��ָ�꣬�����ʽ��ʹ���߾Ϳ������������������ˡ�

�򿪺͹رռ�����
��

���κ�ʱ��ֻ��һ����ʽ���Դ򿪼�����������OpenClipboard�������ǵ�һ����ʽʹ�ü�����ʱ����ֹ�����������ݷ����仯��OpenClipboard����BOOLֵ����˵���Ƿ��Ѿ��ɹ��ش��˼������������һ��Ӧ�ó�ʽû�йرռ���������ô���Ͳ��ܱ��򿪡����ÿ����ʽ�ڻ�Ӧʹ���ߵ�����ʱ������ء����ع淶�ش�Ȼ��رռ���������ô������Զ�����������ܴ򿪼����������⡣

���ǣ��ڲ����ع淶��ʽ������Ȩʽ�๤�����У��ܻᷢ��һЩ���⡣��ʹ�����ij�ʽ��ijЩ���������������ʹ��������һ����Paste��ѡ���ڼ䣬���ij�ʽ��û��ʧȥ���뽹�㣬������Ҳ���ܼٶ�������Ķ�����Ȼ�����һ��������ʽ�п����Ѿ�������ڼ��ȡ���������ˡ�

���ң�������һ����ѶϢ�����йصĸ�΢�����⣺������������㹻�ļ������������ݸ��Ƶ�����������ô������ϣ����ʾһ��ѶϢ���顣���ǣ�������ѶϢ���鲻��ϵͳģ̬�ģ���ôʹ���߿�������ʾѶϢ�����ڼ��л�����һ��Ӧ�ó�ʽ�С���Ӧ��ʹ��ϵͳģ̬��ѶϢ���飬����������ʾѶϢ����֮ǰ�رռ�������

���������ʾһ���Ի�����ʱ������������Ϊ��״̬����ô�������������������⣬�Ի������еı༭��λ��ʹ�ü������������ֵļ�����

��������Unicode
��

����Ϊֹ����ֻ�������ü���������ANSI���֣�ÿ����Ԫ��Ӧһ��λԪ�飩��������CF_TEXTʶ����ʱ�������ָ�ʽ�������ܶ�CF_OEMTEXT��CF_UNICODETEXT������Ϥ�ɡ�

����һЩ����Ϣ���ڴ���������Ҫ�����ָ�ʽʱ����ֻ�����SetClipboardData��GetClipboardData��Windows�����������������е�����ת�������磬��Windows NT�У����һ����ʽ��SetClipboardData������CF_TEXT������������̬����ʽҲ����CF_OEMTEXT����GetClipboardData��ͬ���أ�������Ҳ�ܽ�CF_OEMTEXT����ת��ΪCF_TEXT��

��Windows NT�У�ת��������CF_UNICODETEXT��CF_TEXT��CF_OEMTEXT֮�䡣��ʽӦ��ʹ�öԳ�ʽ������������һ�����ָ�ʽ������SetClipboardData ��ͬ���أ���ʽӦ���ó�ʽ��Ҫ�����ָ�ʽ������GetClipboardData�������Ѿ�֪�������鸽�ϵij�ʽ�ڱ�дʱ���Դ��л򲻴�UNICODEʶ���֡�������ij�ʽҲ���˱�д����ô�ڶ�����UNICODEʶ����֮�ᣬ��ʽ��ִ�д���CF_UNICODETEXT������SetClipboardData�Լ�GetClipboardData���У�������CF_TEXT��

CLIPTEXT��ʽ�����ʽ12-1��ʾ��չʾ��һ�ֿ��еķ�����

 ï¿½ï¿½Ê½12-1  CLIPTEXT
CLIPTEXT.C
/*-------------------------------------------------------------------------
   	CLIPTEXT.C --		The Clipboard and Text
                 							(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/

#include <windows.h>
#include "resource.h"

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
#ifdef UNICODE
#define CF_TCHAR CF_UNICODETEXT
TCHAR szDefaultText[]		= TEXT ("Default Text - Unicode Version") ;
TCHAR szCaption[]			= TEXT ("Clipboard Text Transfers - Unicode Version") ;
#else
#define CF_TCHAR CF_TEXT
TCHAR szDefaultText[] = TEXT ("Default Text - ANSI Version") ;
TCHAR szCaption[]     		= TEXT ("Clipboard Text Transfers - ANSI Version") ;

#endif
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    		PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR 	szAppName[] = TEXT ("ClipText") ;
     	HACCEL       			hAccel ;
     	HWND         			hwnd ;
     	MSG          			msg ;
     	WNDCLASS     			wndclass ;
     
     	wndclass.style         			= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   			= WndProc ;
     	wndclass.cbClsExtra    			= 0 ;
     	wndclass.cbWndExtra    			= 0 ;
     	wndclass.hInstance     			= hInstance ;
     	wndclass.hIcon         			= LoadIcon (NULL, IDI_APPLICATION) ;
     	wndclass.hCursor       			= LoadCursor (NULL, IDC_ARROW) ;
     	wndclass.hbrBackground 		= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     	wndclass.lpszMenuName  		= szAppName ;
     	wndclass.lpszClassName 		= szAppName ;

     	if (!RegisterClass (&wndclass))
     {
          		MessageBox (	NULL, TEXT ("This program requires Windows NT!"),
                      							szAppName, MB_ICONERROR) ;
          		return 0 ;
     }
     
     	hwnd = CreateWindow (szAppName, szCaption,
                          	WS_OVERLAPPEDWINDOW, 
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	NULL, NULL, hInstance, NULL) ;
     
     	ShowWindow (hwnd, iCmdShow) ;
     	UpdateWindow (hwnd) ;
	hAccel = LoadAccelerators (hInstance, szAppName) ;

     	while (GetMessage (&msg, NULL, 0, 0))
     	{
          		if (!TranslateAccelerator (hwnd, hAccel, &msg))
          {
               			TranslateMessage (&msg) ;
               			DispatchMessage (&msg) ;
          		}
  	}
     	return msg.wParam ;
}

LRESULT CALLBACK WndProc (	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static PTSTR 		pText ;
     	BOOL         		bEnable ;
     	HGLOBAL      		hGlobal ;
     	HDC          		hdc ;
     	PTSTR        		pGlobal ;
     	PAINTSTRUCT  		ps ;
     	RECT         		rect ;
     
   	switch (message)
     	{
     	case 	WM_CREATE:
          		SendMessage (hwnd, WM_COMMAND, IDM_EDIT_RESET, 0) ;
          		return 0 ;

    	case 	WM_INITMENUPOPUP:
          		EnableMenuItem 		((HMENU)	wParam,	IDM_EDIT_PASTE,
               		IsClipboardFormatAvailable 	(CF_TCHAR) ? 	MF_ENABLED 	: MF_GRAYED) ;

          		bEnable = pText ? MF_ENABLED : MF_GRAYED ;

          		EnableMenuItem		((HMENU)	wParam,	IDM_EDIT_CUT,		bEnable) ;
          		EnableMenuItem		((HMENU)	wParam,	IDM_EDIT_COPY,		bEnable) ;
          		EnableMenuItem		((HMENU)	wParam,	IDM_EDIT_CLEAR,	bEnable) ;
          		break ;
          
     	case 	WM_COMMAND:
          		switch (LOWORD (wParam))
          		{
          		case 	IDM_EDIT_PASTE:
               				OpenClipboard (hwnd) ;

               				if 	(hGlobal = GetClipboardData (CF_TCHAR))
               				{
                    						pGlobal = GlobalLock (hGlobal) ;
                 					if (pText)
                    					{
                         							free (pText) ;
                         							pText = NULL ;
                    					}
                    					pText = malloc (GlobalSize (hGlobal)) ;
                    					lstrcpy (pText, pGlobal) ;
                    					InvalidateRect (hwnd, NULL, TRUE) ;
               				}
               				CloseClipboard () ;
               				return 0 ;

          		case 	IDM_EDIT_CUT:
          		case 	IDM_EDIT_COPY:
               				if (!pText)
                    					return 0 ;

               				hGlobal = GlobalAlloc (GHND | GMEM_SHARE, 
                            (lstrlen (pText) + 1) * sizeof (TCHAR)) ;
               				pGlobal = GlobalLock (hGlobal) ;
               				lstrcpy (pGlobal, pText) ;
               				GlobalUnlock (hGlobal) ;

               				OpenClipboard (hwnd) ;
               				EmptyClipboard () ;
               				SetClipboardData (CF_TCHAR, hGlobal) ;
               				CloseClipboard () ;

               			if (	LOWORD (wParam) == IDM_EDIT_COPY)
                    					return 0 ;        
                         // fall through for IDM_EDIT_CUT
          		case 	IDM_EDIT_CLEAR:
               				if (pText)
               				{
                    					free (pText) ;
                    					pText = NULL ;
               				}
               			InvalidateRect (hwnd, NULL, TRUE) ;
               			return 0 ;

          		case 	IDM_EDIT_RESET:
               				if (pText)
               				{
                    					free (pText) ;
                    					pText = NULL ;
               				}
               		pText = malloc ((lstrlen (szDefaultText) + 1) * sizeof (TCHAR)) ;
               				lstrcpy (pText, szDefaultText) ;
               				InvalidateRect (hwnd, NULL, TRUE) ;
               				return 0 ;
          		}
          		break ;

     	case 	WM_PAINT:
          		hdc = BeginPaint (hwnd, &ps) ;

          		GetClientRect (hwnd, &rect) ;
          
          		if (pText != NULL)
               	DrawText 	(hdc, pText, -1, &rect, DT_EXPANDTABS | DT_WORDBREAK) ;

          		EndPaint (hwnd, &ps) ;
          		return 0 ;
          
     	case 	WM_DESTROY:
          		if (	pText)
               				free (pText) ;

          				PostQuitMessage (0) ;
          				return 0 ;
     	}
	return DefWindowProc (hwnd, message, wParam, lParam) ;
}
 CLIPTEXT.RC ��ժ¼��
//Microsoft Developer Studio generated resource script.
#include "resource.h"
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
// Menu
CLIPTEXT MENU DISCARDABLE 
BEGIN
	POPUP "&Edit"
    	BEGIN
		MENUITEM "Cu&t\tCtrl+X",   			IDM_EDIT_CUT
        MENUITEM "&Copy\tCtrl+C",      		IDM_EDIT_COPY
        MENUITEM "&Paste\tCtrl+V",          	IDM_EDIT_PASTE
MENUITEM "De&lete\tDel",            	IDM_EDIT_CLEAR
        MENUITEM SEPARATOR			
        MENUITEM "&Reset",       	            IDM_EDIT_RESET
    	END
END

/////////////////////////////////////////////////////////////////////////////
// Accelerator
CLIPTEXT ACCELERATORS DISCARDABLE 
BEGIN
    	"C",           IDM_EDIT_COPY,     VIRTKEY, CONTROL, NOINVERT
    	"V",           IDM_EDIT_PASTE,    VIRTKEY, CONTROL, NOINVERT
    	VK_DELETE,      		 IDM_EDIT_CLEAR,    VIRTKEY, NOINVERT
    	"X",           IDM_EDIT_CUT,      VIRTKEY, CONTROL, NOINVERT
END
 RESOURCE.H��ժ¼��
// Microsoft Developer Studio generated include file.
// Used by ClipText.rc

#define IDM_EDIT_CUT           40001
#define IDM_EDIT_COPY          40002
#define IDM_EDIT_PASTE         40003
#define IDM_EDIT_CLEAR         40004
#define IDM_EDIT_RESET         40005

������Windows NT��ִ��Unicode���ANSI���ʽ�ĸ�����ҿ��Կ������������������������Ԫ��֮��ת���ġ�ע��CLIPTEXT.C������#ifdef���������������UNICODEʶ���֣���ôCF_TCHAR����������һ�ֳ��õļ�������ʽ���͵��CF_UNICODETEXT���������͵��CF_TEXT����ʽ������е�IsClipboardFormatAvailable��GetClipboardData��SetClipboardData��ʽ��ʹ��CF_TCHAR��ָ��������̬��

�ڳ�ʽ�Ŀ�ʼ���֣��Լ����ӡ�Edit�����ܱ���ѡ��Reset��ѡ��ʱ������̬����pText����һ��ָ�꣬��Unicode��ij�ʽ�У�ָ��ָ��Unicode�ִ���Default Text -Unicode version�����ڷ�Unicode��ij�ʽ�У�ָ��ָ��Default Text - ANSI version�����������á�Cut����Copy������ִ����ݸ����������á�Cut����Delete������ӳ�ʽ��ɾ���ִ�����Paste������������е��������ݸ��Ƶ�pText����WM_PAINTѶϢ�����ڼ䣬pText���ִ���ʾ�ڳ�ʽ����ʾ����

���������Unicode���CLIPTEXT��ѡ���ˡ�Copy�����Ȼ���ڷ�Unicode����ѡ��Paste�������ô�����ܿ��������Ѿ���Unicodeת������ANSI�����Ƶأ������ִ���෴�IJ�������ô���־ͻ��ANSIת����Unicode��

���ӵļ������÷�
��

�����Ѿ��������ڽ�����׼����֮�ᣬ�Ӽ�������������ʱ��Ҫ�ĸ����У�

OpenClipboard 			(hwnd) ;
EmptyClipboard 			() ;
SetClipboardData 		(iFormat, hGlobal) ;
CloseClipboard 			() ;

��ȡ��Щ������Ҫ��������

OpenClipboard (hwnd) ;
hGlobal = GetClipboardData (iFormat) ;
�����г�ʽ
CloseClipboard () ;

��GetClipboardData��CloseClipboard����֮�䣬���Ը��Ƽ��������ϻ���������ʽ��ʹ�������ܶ�Ӧ�ó�ʽ����Ҫ�������ַ�������Ҳ�����ø����ӵķ�ʽ��ʹ�ü�������

���ö��������Ŀ
��

���򿪼������������ϴ��͸���ʱ�������Ⱥ���EmptyClipboard��֪ͨWindows�ͷŻ�ɾ���������ϵ����ݡ����������еļ����������и����������������ԣ�������������˵��������ÿ��ֻ�ܱ���һ��������Ŀ��

���ǣ�������EmptyClipboard��CloseClipboard����֮���κ���SetClipboardData��ÿ�ζ�ʹ�ò�ͬ�ļ�������ʽ�����磬������ڼ������д���һ���̵ܶ������ִ������԰��������д��metafile��Ҳ���԰��������д�����ͼ���ѵ���ͼѡ��������װ�������У���������ִ�д������ͼ�С��������ַ�������ʹ�ִ�������Ϊ�Ӽ������϶�ȡ���ֵij�ʽ��ʹ�ã�Ҳ����Ϊ�Ӽ������϶�ȡ����ͼ��metafile�ij�ʽ��ʹ�á���Ȼ����Щ��ʽ������֪��metafile�����ͼʵ���ϰ�����һ���ִ���

������һЩ����д���������ϣ���ÿ�����ž����Ժ��� SetClipboardData��

OpenClipboard 		(hwnd) ;
EmptyClipboard 		() ;
SetClipboardData 	(CF_TEXT, hGlobalText) ;
SetClipboardData 	(CF_BITMAP, hBitmap) ;
SetClipboardData 	(CF_METAFILEPICT, hGlobalMFP) ;
CloseClipboard 		() ;

�������ָ�ʽ������ͬʱλ춼�������ʱ����CF_TEXT��CF_BITMAP��CF_METAFILEPICT��������IsClipboardFormatAvailable������TRUE��ͨ�����к��г�ʽ���Դ�ȡ��Щ���룺

hGlobalText = GetClipboardData (CF_TEXT) ;

��

hBitmap = GetClipboardData (CF_BITMAP) ;

��

hGlobalMFP = GetClipboardData (CF_METAFILEPICT) ;

��һ�γ�ʽ����EmptyClipboardʱ��Windows���ͷŻ�ɾ���������ϱ����������������š�

�ڽ���ͬ�����ָ�ʽ����ͬ�ĵ���ͼ��ʽ���߲�ͬ��metafile��ʽ���ӵ�������ʱ����Ҫʹ�����ּ�����ֻʹ��һ�����ָ�ʽ��һ�ֵ���ͼ��ʽ�Լ�һ��metafile��ʽ����������˵��������Windows����CF_TEXT��CF_OEMTEXT��CF_UNICODETEXT֮��ת����Ҳ������CF_BITMAP��CF_DIB֮�䣬�Լ���CF_METAFILEPICT��CF_ENHMETAFILE֮�����ת����

͸�����ȴ򿪼�������Ȼ�����EnumClipboardFormats����ʽ����ȷ����������������и�ʽ����ʼʱ�趨����iFormatΪ0��

iFormat = 0 ;
OpenClipboard (hwnd) ;

���ڴ�0ֵ��ʼ��ν���������EnumClipboardFormats���С���ʽ��ΪĿǰ�ڼ������е�ÿ�ָ�ʽ����һ������iFormatֵ������ʽ����0ʱ����ʾ��ɣ�

while (iFormat = EnumClipboardFormats (iFormat))
{
    ����iFormatֵ�Ĵ�����ʽ
}
CloseClipboard () ;

������ͨ������ĺ�����ȡ��Ŀǰ�ڼ�������֮��ͬ��ʽ�ĸ�����

iCount = CountClipboardFormats () ;

�ӳ����
��

�������Ϸ����������ʱ��һ����˵Ҫ����һ�����ϵĸ���������������ݸ����ļ��������Ŵ������������Էdz����������Ŀ��˵�����ַ������˷Ѽ�����ռ䡣���ʹ���߲��������ճ������һ����ʽ���ô���ڱ���������ȡ��֮ǰ������һֱռ����������ռ䡣

ͨ��ʹ��һ�ֽ������ӳ�������ļ������Ա���������⡣ʵ���ϣ�ֱ����һ����ʽ��Ҫ���ϣ���ʽ���ṩ������ϡ�Ϊ�ˣ��������ϴ��Ŵ���Windows��������SetClipboardData������ʹ��NULL��

OpenClipboard 		(hwnd) ;
EmptyClipboard 		() ;
SetClipboardData 	(iFormat, NULL) ;
CloseClipboard 		() ;

�����ж��ʹ�ò�ͬiFormatֵ��SetClipboardData���У�������ijЩ���п�ʹ��NULLֵ����������һЩ��ʹ��ʵ�ʵĴ���ֵ��

ǰ��Ĺ��̱Ƚϼ򵥣����µĹ��̾�Ҫ��΢����һЩ�ˡ�����һ����ʽ����GetClipboardDataʱ��Windows��������ָ�ʽ�Ĵ����Ƿ�ΪNULL������ǣ�Windows�����������������ߡ������ij�ʽ������һ��ѶϢ��Ҫ��ȡ�����ϵ�ʵ�ʴ��ţ���ʱ���ij�ʽ�����ṩ������š�

�������˵���������������ߡ��ǽ����Ϸ��������������һ���Ӵ�����һ����ʽ����OpenClipboardʱ��Windows������������ʽʱ���õ��Ӵ����ţ�������ű�ʾ�򿪼��������Ӵ���һ���յ�һ��EmptyClipboard���У�Windows��ʹ����Ӵ���Ϊ�µļ����������ߡ�

ʹ���ӳ���������ij�ʽ�������Ӵ�ѶϢ������ʽ�б��봦������ѶϢ��WM_RENDERFORMAT��WM_RENDERALLFORMATS��WM_DESTROYCLIPBOARD������һ����ʽ����GetClipboardDataʱ��Windows���Ӵ�ѶϢ������ʽ����һ��WM_RENDERFORMATѶϢ��wParam��ֵ����Ҫ��ĸ�ʽ���ڴ���WM_RENDERFORMATѶϢʱ����Ҫ�򿪻���ռ�������ΪwParam��ָ���ĸ�ʽ����һ�����������飬�����ݴ�������������ȷ�ĸ�ʽ����Ӧ���ź���SetClipboardData�������Եأ�Ϊ���ڴ���WM_RENDERFORMATʱ��ȷ�ع���������ϣ���Ҫ�ڳ�ʽ�б�����Щ��Ѷ������һ����ʽ����EmptyClipboardʱ��Windows�����ij�ʽ����һ��WM_DESTROYCLIPBOARDѶϢ��������������Ҫ������������ϵ���Ѷ�����ij�ʽ�����Ǽ������������ߡ�

�����ʽ�����Լ���Ȼ�Ǽ����������ߵ�ʱ���Ҫ��ִֹ�У����Ҽ���������Ȼ�������ó�ʽ��SetClipboardData�趨��NULL���ϴ��ţ������յ�WM_RENDERALLFORMATSѶϢ����ʱ��Ӧ�ô򿪼�������������������������������У���Ϊÿ�ָ�ʽ����SetClipboardData��Ȼ��رռ�������WM_RENDERALLFORMATSѶϢ���Ӵ�ѶϢ������ʽ�����յ���ѶϢ֮һ�����������WM_DESTROYCLIPBOARDѶϢ������Ѿ�������������ϣ���Ȼ����������WM_DESTROYѶϢ��

������ij�ʽֻ�������������һ�ָ�ʽ�����ϣ��������֣�����ô�����԰�WM_RENDERALLFORMATS��WM_RENDERFORMAT���������һ����Щ��ʽ��Ӧ����������������

case 	WM_RENDERALLFORMATS :
     	OpenClipboard (hwnd) ;
     	EmptyClipboard () ;
                              				// fall through
case 	WM_RENDERFORMAT :
    // �����ַ�������������
     	SetClipboardData (CF_TEXT, hGlobal) ;
     	if (message == WM_RENDERALLFORMATS)
          		CloseClipboard () ;
     	return 0 ;

������ij�ʽʹ�úü��ּ�������ʽ����ô��������ΪwParam��Ҫ��ĸ�ʽ����WM_ RENDERFORMAT�����dz�ʽ�ڴ�Ź��������������Ѷʱ�������ѣ�������Ҫ����WM_DESTROYCLIPBOARDѶϢ��

�Զ����ϸ�ʽ
��

��ĿǰΪֹ�����ǽ�������Windows����ı�׼���������ϸ�ʽ�����ǣ����������ü����������桸�Զ����ϸ�ʽ�����������鴦����ʽʹ�����ּ������������������͸�ʽ����Ѷ�����֡�

����֮�£���������ƺ���û������ġ��������������������Ӧ�ó�ʽ֮�䴫�����ϣ���ô��Ϊʲô��������Ҫ����ֻ��һ��Ӧ�ó�ʽ��������������أ��𰸺ܼ򵥣�������������ͬһ����ʽ���ڲ������߿�����һ����ʽ�еIJ�ִͬ��ʵ��֮�䣩�������ϡ������Եأ���Щִ��ʵ�������������Լ����Զ����ϸ�ʽ��

�м���ʹ���Զ����ϸ�ʽ�ķ�������򵥵ķ����õ�һ�ֱ������DZ�׼��������ʽ�����֡�����ͼ��metafile�������ϣ����Ǹ�����ʵ����ֻ�����ij�ʽ�����塣��������£���SetClipboardData��GetClipboardData�����п�ʹ������wFormatֵ��CF_DSPTEXT��CF_DSPBITMAP��CF_DSPMETAFILEPICT��CF_DSPENHMETAFILE����ĸDSP��������ʾ����������Щ��ʽ����Windows�����֡�����ͼ��metafile���������ʾ���ϡ����ǣ���һ��ʹ�ó����CF_TEXT��CF_BITMAP��CF_DIB��CF_METAFILEPICT��CF_ENHMETAFILE��ʽ����GetClipboardData�ij�ʽ������ȡ��������ϡ�

���������һ�ָ�ʽ�����Ϸ���������У������ʹ��ͬ���ĸ�ʽ�������ϡ����ǣ����֪�����������Գ�ʽ����һ��ִ��ʵ�壬��������ʹ������ij�����ϸ�ʽ����һ����ʽ�أ�������һ�ַ���������͸�����к������Ȼ�ü����������ߣ�

hwndClipOwner = GetClipboardOwner () ;

Ȼ����Եõ����Ӵ����ŵ��Ӵ�������ƣ�

TCHAR szClassName [32] ;
//�����г�ʽ
GetClassName (hwndClipOwner, szClassName, 32) ;

�������������ʽ������ͬ����ô�������ɳ�ʽ����һ��ִ��ʵ�崫�͵��������еġ�

ʹ���Զ����ϸ�ʽ�ĵڶ��ַ����漰��CF_OWNERDISPLAY��ꡣSetClipboardData����������������NULL��

SetClipboardData (CF_OWNERDISPLAY, NULL) ;

����ijЩ���鴦����ʽ��Windows�ļ��������������ʾ��������ʾ��ʽ������ʱ�����õķ����������Եأ��������������֪�������ʾ���ָ�ʽ�����֡���һ�����鴦����ʽָ��CF_OWNERDISPLAY��ʽʱ����Ҳ�ͳе����ڼ��������������ʾ�����л�ͼ�����Ρ�

���������������ΪNULL��������CF_OWNERDISPLAY��ʽ�������������ߣ�����SetClipboardData�ij�ʽ���봦����Windows���������������ߵ��ӳ����ѶϢ���Լ�5������ѶϢ����5��ѶϢ���ɼ�������������͵������������ߵģ�

  •  WM_ASKCBFORMATNAME ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¶Ï¢ï¿½ï¿½ï¿½Íµï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß£ï¿½ï¿½ÔµÃµï¿½ï¿½ï¿½ï¿½Ï¸ï¿½Ê½ï¿½ï¿½ï¿½Æ¡ï¿½lParam������ָ�ò»º³ï¿½ï¿½ï¿½ï¿½ï¿½Ö¸ï¿½ê£¬wParam����������������ɵ������Ԫ��Ŀ�������������߱���Ѽ��������ϸ�ʽ�����ָ��Ƶ�����������С�
    ��
  •  WM_SIZECLIPBOARD ï¿½ï¿½ï¿½Ñ¶Ï¢Í¨Öªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß£ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë±ä»¯ï¿½ï¿½wParam�����Ǽ�����������Ĵ��ţ�lParam��ָ������³ߴ��RECT�ṹ��ָ�ꡣ���RECT�ṹ�ж���0���������������˳�����С��������Windows�ļ����������ֻ�������Լ���һ��ִ��ʵ��ִ�У������������������Ҳ�ܰ����ѶϢ���͸������������ߡ�Ӧ�������������������Dz����ܣ��ٶ�wParam��ʶ�ض�������������������������ߴ�������Ҳ�����ס�
    ��
  •  WM_PAINTCLIPBOARD ï¿½ï¿½ï¿½Ñ¶Ï¢Í¨Öªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Þ¸Ä¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ê¾ï¿½ï¿½ï¿½ï¿½Í¬Ê±ï¿½ï¿½wParam�Ǽ�����������Ӵ��Ĵ��ţ�lParam��ָ��PAINTSTRUCT�ṹ������ָ�ꡣ�����������߿��ԴӴ˽ṹ��hdc���еõ������������װ�����ݵĴ��š�
    ��
  •  WM_HSCROLLCLIPBOARD��WM_VSCROLLCLIPBOARD ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¶Ï¢Í¨Öªï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ß£ï¿½Ê¹ï¿½ï¿½ï¿½ï¿½ï¿½Ñ¾ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ë¼ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ä¾ï¿½ï¿½ï¿½ï¿½Ð¡ï¿½wParam�����Ǽ�����������Ӵ��Ĵ��ţ�lParam�ĵ������Ǿ������󣬲��ң������������SB_THUMBPOSITION����ôlParam�ĸ�������ǻ���λ�á�
    ��

������ЩѶϢ�Ƚ��鷳����������ֵ�������������ǣ����ִ�����ʹ������˵������ġ��������鴦����ʽ�����ָ��Ƶ�������ʱ��ʹ�����ڼ��������������ʾ�����п������ֻ���������ʽʱ�������̹Щ��

ʹ��˽�м��������ϸ�ʽ�ĵ����ַ�����ע���Լ��ļ�������ʽ��������Windows�ṩ��ʽ����Windows����ʽ�ṩһ����ţ�����������SetClipboardData��GetClipboardData�ĸ�ʽ������һ����˵���������ַ����ij�ʽҲҪ��һ�ֱ�׼��ʽ�����ϸ��Ƶ������������ַ��������������������������ʾ��������ʾ���ϣ�û����CF_OWNERDISPLAY��صij�ͻ������������������ʽ�Ӽ������ϸ������ϡ�

���磬�ٶ������Ѿ���д��һ���Ե���ͼ��ʽ��metafile��ʽ���Լ�����ע��ļ�������ʽ�����ϸ��Ƶ��������е�������ͼ��ʽ�����������������ʾmetafile���ߵ���ͼ�������Ӽ������϶�ȡ����ͼ��metafile�ij�ʽ������⼸�ָ�ʽ�����ǣ������ǵ�������ͼ��ʽ��Ҫ�Ӽ������϶�����ʱ�����ᰴ���Լ���ע��ĸ�ʽ�������ϣ�������Ϊ���ָ�ʽ���ܰ������ȵ���ͼ��������metafile�������Ѷ��

��ʽ͸������ĺ�����ע��һ���µļ�������ʽ��

iFormat = RegisterClipboardFormat (szFormatName) ;

iFormat��ֵ���0xC000��0xFFFF֮�䡣���������������һ��ͨ������EnumClipboardFormatsȡ��Ŀǰ���м��������ϸ�ʽ�ij�ʽ������ȡ���������ϸ�ʽ��ASCII���ƣ�����ͨ���������ʵ���ģ�

GetClipboardFormatName (iFormat, psBuffer, iMaxCount) ;

Windows�����iMaxCount����Ԫ���Ƶ�psBuffer�С�

ʹ�����ַ��������ϸ��Ƶ��������еij�ʽд���ߣ�������Ҫ�������ϸ�ʽ���ƺ�ʵ�ʵ����ϸ�ʽ����������ʽ������������ô������ʽ�ͻ������ָ�ʽ�Ӽ������и������ϡ�

ʵ�������������
��

���Ӽ��������ݱ仯�ij�ʽ��Ϊ�������������������������Windows�еõ�һ���������������������Ҳ���Ա�д�Լ��ļ������������ʽ�������������ͨ�����ݵ�������Ӵ�ѶϢ������ʽ��ѶϢ�����Ӽ��������ݵı仯��

�������������
��

���������ļ����������Ӧ�ó�ʽ������ͬʱ��Windows��ִ�У����Ƕ����Լ��Ӽ��������ݵı仯�����ǣ���Windows�ĽǶ�������ֻ����һ������������������dz�֮Ϊ��Ŀǰ���������������Windowsֻ����һ��ʶ��Ŀǰ��������������Ӵ����ţ����ҵ������������ݷ����仯ʱֻ��ѶϢ���͵��Ǹ��Ӵ��С�

�����������Ӧ�ó�ʽ�б�Ҫ���롸������������������Ա�ִ�е����м�����������������յ�Windows���͸�Ŀǰ�������������ѶϢ����һ����ʽ���Լ�ע��Ϊһ�������������ʱ�����ͳ�ΪĿǰ�ļ������������Windows����ǰ��Ŀǰ������Ӵ����Ž��������ʽ�����Ҵ˳�ʽ������������š����˳�ʽ�յ�һ�������������ѶϢʱ���������ѶϢ���͸�������������һ����ʽ���Ӵ�ѶϢ������ʽ��

������������ĺ�ʽ��ѶϢ
��

��ʽ͸������SetClipboardViewer��ʽ���Գ�Ϊ���������������һ���֡������ʽ����Ҫ��������Ϊ���������������ô�����ʽ��WM_CREATEѶϢ�����ڼ���Ժ��������ʽ���ú�ʽ����ǰһ��Ŀǰ��������������Ӵ����š���ʽӦ�ð�������Ŵ����ھ�̬�����У�

static HWND hwndNextViewer ;
//�����г�ʽ
case 	WM_CREATE :
	//�����г�ʽ
     	hwndNextViewer = SetClipboardViewer (hwnd) ;

�����Windows��һ��ִ���ڼ䣬���ij�ʽ��Ϊ������������ĵ�һ����ʽ����ôhwndNextViewer��ΪNULL��

���ܼ������е����������仯��Windows������WM_DRAWCLIPBOARDѶϢ���͸�Ŀǰ�ļ���������������ע��Ϊ��������������Ӵ�������������������е�ÿ����ʽ��Ӧ����SendMessage�����ѶϢ���͵���һ�����������������������е�����һ����ʽ����һ�����Լ�ע��Ϊ��������������Ӵ����������hwndNextViewerΪNULL�����hwndNextViewerΪNULL����ô��ʽֻ�򵥵ؽ�������Ȩ����ϵͳ���ѣ�������������ʽ�����κ�ѶϢ����Ҫ��WM_DRAWCLIPBOARDѶϢ��WM_PAINTCLIPBOARDѶϢ�����ˡ�WM_PAINTCLIPBOARD���ɼ�������������͸�ʹ��CF_OWNERDISPLAY���������ϸ�ʽ�ij�ʽ����WM_ DRAWCLIPBOARDѶϢ����Windows����Ŀǰ������������ģ���

����WM_DRAWCLIPBOARDѶϢ����򵥷����ǽ�ѶϢ���͸���һ�������������������hwndNextViewerΪNULL������ʹ�Ӵ�����ʾ������Ч��

case 	WM_DRAWCLIPBOARD :
     	if	(	hwndNextViewer)
          			SendMessage (hwndNextViewer, message, wParam, lParam) ;

     	InvalidateRect (hwnd, NULL, TRUE) ;
     	return 0 ;

�ڴ���WM_PAINTѶϢ�����ڼ䣬ͨ��ʹ�ó����OpenClipboard��GetClipboardData��CloseClipboard���п��Զ�ȡ�����������ݡ�

��ij����ʽ��Ӽ��������������ɾ�����Լ�ʱ�����������ChangeClipboardChain�������ʽ����������������ij�ʽ֮�Ӵ����ţ�����һ����������������Ӵ����ţ�

ChangeClipboardChain (hwnd, hwndNextViewer) ;

����ʽ����ChangeClipboardChainʱ��Windows����WM_CHANGECBCHAINѶϢ��Ŀǰ�ļ������������wParam�����Ǵ������Ƴ����Լ����Ǹ�������Ӵ����ţ�ChangeClipboardChain�ĵ�һ����������lParam�Ǵ������Ƴ��Լ������һ����������������Ӵ����ţ�ChangeClipboardChain�ĵڶ�����������

����ʽ���յ�WM_CHANGECBCHAINѶϢʱ��������wParam�Ƿ����Ѿ������hwndNextViewer��ֵ���������������ʽ�����趨hwndNextViewerΪlParam���������֤������WM_DRAWCLIPBOARDѶϢ���ᷢ�͸��Ӽ��������������ɾ�����Լ����Ӵ������wParam�����hwndNextViewer ������hwndNextViewer��ΪNULL�����ѶϢ�͵���һ���������������

case 	WM_CHANGECBCHAIN :
     	if ((HWND) wParam == hwndNextViewer)
          		hwndNextViewer = (HWND) lParam ;

     	else if (hwndNextViewer)
          				SendMessage (hwndNextViewer, message, wParam, lParam) ;
     	return 0 ;

��һ��Ҫʹ��else if��������ֻ��춱�֤hwndNextViewerΪ��NULL��ֵ��hwndNextViewer��ֵΪNULLʱ��ִ����γ�ʽ��ij�ʽ������������һ��������������Dz����ܵġ�

����ʽ�����ʱ���������Ȼ�ڼ�������������У�����������ɾ�������������ڴ���WM_DESTROYѶϢʱ����ChangeClipboardChain������������

case 	WM_DESTROY :
	ChangeClipboardChain (hwnd, hwndNextViewer) ;
     	PostQuitMessage (0) ;
     	return 0 ;

Windows����һ��������ʽ��õ�һ��������������Ӵ����ŵĺ�ʽ��

hwndViewer = GetClipboardViewer () ;

һ����˵����Ҫ�����ʽ�����û��Ŀǰ�ļ�������������򴫻�ֵΪNULL��

������һ��˵�����������������ι��������ӡ���Windows������ʱ��Ŀǰ�������������NULL��

������������� NULL

һ������hwnd1�Ӵ����ŵij�ʽ����SetClipboardViewer�������ʽ���ص�NULL��Ϊ�����ʽ�е�hwndNextViewerֵ��

Ŀǰ������������� hwnd1

hwnd1����һ��������� NULL

�ڶ�������hwnd2�Ӵ����ŵij�ʽ����SetClipboardViewer ��������hwnd1��

Ŀǰ�ļ������������ hwnd2

hwnd2����һ��������� hwnd1

hwnd1����һ��������� NULL

ÿ������ʽ (hwnd3)�͵��ĸ���ʽ (hwnd4) Ҳ����SetClipboardViewer �����Ҵ���hwnd2��hwnd3��

Ŀǰ�ļ������������ hwnd4

hwnd4����һ��������� hwnd3

hwnd3����һ��������� hwnd2

hwnd2����һ��������� hwnd1

hwnd1����һ��������� NULL

�������������ݷ����仯ʱ�� Windows����һ��WM_DRAWCLIPBOARDѶϢ��hwnd4�� hwnd4����ѶϢ��hwnd3��hwnd3����ѶϢ��hwnd2��hwnd2����ѶϢ��hwnd1��hwnd1���ء�

����hwnd2����ͨ�����к��д�����ɾ���Լ���

ChangeClipboardChain (hwnd2, hwnd1) ;

Windows��wParam���hwnd2��lParam���hwnd1��WM_CHANGECBCHAINѶϢ���͸�hwnd4�����hwnd4����һ����������hwnd3������hwnd4�����ѶϢ����hwnd3������hwnd3ע�⵽wParam���������һ��������(hwnd2)�����Խ���һ��������趨ΪlParam (hwnd1)���Ҵ��ء���������������ˡ����ڼ���������������£�

Ŀǰ������������� hwnd4

hwnd4����һ��������� hwnd3

hwnd3����һ��������� hwnd1

hwnd1����һ��������� NULL

һ���򵥵ļ����������
��

�������������һ��Ҫ��Windows���ṩ���������ƣ����磬���������������ֻ��ʾһ�ּ��������ϸ�ʽ����ʽ12-2����ʾ��CLIPVIEW��ʽ��һ��ֻ����ʾCF_TEXT��ʽ�ļ������������

 ï¿½ï¿½Ê½12-2  CLIPVIEW
CLIPVIEW.C
/*-------------------------------------------------------------------------
   	CLIPVIEW.C --	Simple Clipboard Viewer
                 						(c) Charles Petzold, 1998
--------------------------------------------------------------------------*/

#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain	(	HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    	PSTR szCmdLine, int iCmdShow)
{
     	static TCHAR	szAppName[] = TEXT ("ClipView") ;
     	HWND         			hwnd ;
     	MSG          			msg ;
     	WNDCLASS     			wndclass ;
     
     	wndclass.style         			= CS_HREDRAW | CS_VREDRAW ;
     	wndclass.lpfnWndProc   			= WndProc ;
     	wndclass.cbClsExtra    			= 0 ;
     	wndclass.cbWndExtra    			= 0 ;
     	wndclass.hInstance     			= hInstance ;
     	wndclass.hIcon         			= LoadIcon (NULL, IDI_APPLICATION) ;
     	wndclass.hCursor       			= LoadCursor (NULL, IDC_ARROW) ;
     	wndclass.hbrBackground 		= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     	wndclass.lpszMenuName  		= NULL ;
     	wndclass.lpszClassName 		= szAppName ;
     
     	if (!RegisterClass (&wndclass))
     {
          		MessageBox (	NULL, TEXT ("This program requires Windows NT!"),
                      		szAppName, MB_ICONERROR) ;
          		return 0 ;
	}
     
     	hwnd = CreateWindow (szAppName, 
                          			TEXT ("Simple Clipboard Viewer (Text Only)"),
                          	WS_OVERLAPPEDWINDOW,
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	CW_USEDEFAULT, CW_USEDEFAULT,
                          	NULL, NULL, hInstance, NULL) ;
     
     	ShowWindow (hwnd, iCmdShow) ;
     	UpdateWindow (hwnd) ;
     
     	while (GetMessage (&msg, NULL, 0, 0))
     	{
          		TranslateMessage (&msg) ;
          		DispatchMessage (&msg) ;
     	}
     	return msg.wParam ;
}

LRESULT CALLBACK WndProc	(	HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam)
{
     	static HWND 	hwndNextViewer ;
     	HGLOBAL     			hGlobal ;
     	HDC         			hdc ;
     	PTSTR       			pGlobal ;
     	PAINTSTRUCT 		    ps ;
     	RECT        			rect ;
     
     	switch (message)
     	{
     	case 	WM_CREATE:
          		hwndNextViewer = SetClipboardViewer (hwnd) ;
          		return 0 ;
          
     	case 	WM_CHANGECBCHAIN:
          		if ((HWND) wParam == hwndNextViewer)
               				hwndNextViewer = (HWND) lParam ;
          
          		else if	(hwndNextViewer)
               					SendMessage (hwndNextViewer, message, wParam, lParam) ;
          
          return 0 ;
     	case 	WM_DRAWCLIPBOARD:
          		if (hwndNextViewer)
               				SendMessage (hwndNextViewer, message, wParam, lParam) ;
          
          		InvalidateRect (hwnd, NULL, TRUE) ;
          		return 0 ;
          
     	case 	WM_PAINT:
          		hdc = BeginPaint (hwnd, &ps) ;
          		GetClientRect (hwnd, &rect) ;
          		OpenClipboard (hwnd) ;
          
#ifdef UNICODE
          		hGlobal = GetClipboardData (CF_UNICODETEXT) ;
#else
          		hGlobal = GetClipboardData (CF_TEXT) ;
#endif
          		if (hGlobal != NULL)
          		{
               			pGlobal = (PTSTR) GlobalLock (hGlobal) ;
               			DrawText (hdc, pGlobal, -1, &rect, DT_EXPANDTABS) ;
               			GlobalUnlock (hGlobal) ;
          		}
          
          		CloseClipboard () ;
          		EndPaint (hwnd, &ps) ;
          		return 0 ;
          
     	case 	WM_DESTROY:
          		ChangeClipboardChain (hwnd, hwndNextViewer) ;
          		PostQuitMessage (0) ;
          		return 0 ;
     	}
     	return DefWindowProc (hwnd, message, wParam, lParam) ;
}

CLIPVIEW�����������۵ķ���������WM_CREATE��WM_CHANGECBCHAIN��WM_DRAWCLIPBOARD��WM_DESTROYѶϢ��WM_PAINTѶϢ�����򿪼�����������CF_TEXT��ʽ����GetClipboardData�������ʽ����һ�������������ţ���ôCLIPVIEW��������������DrawText����ʾ������ʾ���֡�

������׼��ʽ����Windows�ṩ���Ǹ�������һ������������ϸ�ʽ�ļ��������������Ҫ���һЩ����������������ʾ��������Ŀǰ�������ϸ�ʽ�����ơ�ʹ���߿���ͨ������EnumClipboardFormats��ʹ��GetClipboardFormatName�õ��DZ�׼���ϸ�ʽ����������������ʹ��CF_OWNERDISPLAY���ϸ�ʽ�ļ��������������������ĸ�ѶϢ�������������ϵ�ӵ��������ʾ�����ϣ�

WM_PAINTCLIPBOARD

WM_SIZECLIPBOARD

WM_VSCROLLCLIPBOARD

WM_HSCROLLCLIPBOARD

��������д�����ļ��������������ô����ʹ��GetClipboardOwner��ü����������ߵ��Ӵ����ţ���������Ҫ�޸ļ���������ʾ����ʱ������ЩѶϢ���͸����Ӵ���