GetClipboardData() 函数的第一个参数问题

ximenchuifeng 2010-07-15 04:34:04

#include <windows.h>
#define UNICODE

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, // window class name
TEXT ("Simple Clip Viewer (Text Only)"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT, // initial x position
CW_USEDEFAULT, // initial y position
CW_USEDEFAULT, // initial x size
CW_USEDEFAULT, // initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL); // creation parameters

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;
PTSTR pGlobal;
HGLOBAL hGlobal;
HDC hdc;
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);
hGlobal = GetClipboardData (CF_TEXT); //这里的疑问,MSDN中说 CF_TEXT 是ANSI CF_UNICODETEXT是 UNICODE, 但是这个程序偏偏要使用 CF_TEXT 偏偏能显示中文.....而CF_UNICODETEXT 只能显示错误的


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


问题在注释中。。。

对编码一直有中疑惑。。。TXT文档 保存有 ANSI 类型,为什么能够显示类型,不是说ANSI 才8位嘛。。。
...全文
534 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoxiaowei 2010-07-15
  • 打赏
  • 举报
回复
CF_TEXT :文本格式
CF_UNICODETEXT Windows NT/2000/XP: Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the data.
ximenchuifeng 2010-07-15
  • 打赏
  • 举报
回复
cf_text 可以正确显示 中文和英文,但是 cf_unicodetext 不能正确显示。。

我的疑问是:在我映像当中 ansi编码才 8位,不能存储中文,但是这里面 cf_text却能够显示中文,而unicodetext却不能。。。
Eleven 2010-07-15
  • 打赏
  • 举报
回复
一个ASNI编码的字符显示不了,难道两个还显示不了??
查看位图的信息(右键查看): 1.文件头 2.信息头 3.RGB掩码(如果有的话) 显示出来的形式如下: BITMAPFILEHEADER* = 0x02800048 BITMAPFILEHEADER .bfType = 0x4D42 .bfSize = 552158 .bfReserved1 = 0 .bfReserved2 = 0 .bfOffBits = 66 BITMAPINFOHEADER .biSize = 40 .biWidth = 353 .biHeight = 391 .biPlanes = 1 .biBitCount = 32 .biCompression = BI_BITFIELDS .biSizeImage = 552092 .biXPelsPerMeter = 0 .biYPelsPerMeter = 0 .biClrUsed = 0 .biClrImportant = 0 Red Mask = 00FF0000 Green Mask = 0000FF00 Blue Mask = 000000FF 说明: 1.第一行为内存中malloc出来的地址,由于是虚拟内存,不看也罢 2.该程序不止可以查看BITMAPINFOHEADER类型的位图, 其余三种类型也可查看,分别为: BITMAPCOREHEADER、BITMAPV4HEADER、BITMAPV5HEADER 3.最后三行的RGB Mask是颜色掩码,对于BITMAPINFOHEADER类型来说,不一定有。 4.右键功能是查看信息,左键是左右镜像操作,由于是底层数据直接每行左右互换, 而对于1、4位深的这两种位图,底层数据操作涉及位操作,而我还在写这个位图类, 故暂不支持,只支持8位以上的水平镜像操作。 5.支持剪切板操作,并且是以CF_DIB或CF_DIBV5呼叫GetClipboardData函数的, 复制时,也是以该参数呼叫SetClipboardData函数的。 你可以复制其他地方的图片过来,以查看图片属性。 6.程序中运行中保存在内存中的图片是BITMAPFILEHEADER*指针,不是HBITMAP, 呼叫的显示函数是SetDIBitsToDevice函数。 7.鼠标在图片上移动是,右边填充鼠标点的颜色,标题栏也有相关显示。 下边显示鼠标点附近11*11像素范围的放大图像,正中间用十字叉线画出。 取色是直接在底层取数据解析。 8.改程序在《windows程序设计》上的一个例子改编而来,并且正在完善该位图类中, 以加入更多丰富的底层操作功能。 改试验程序主要供想研究位图结构的人查看用。 9.windows搞出了4种位图种类,真作孽~~ 另,16、24、32位深的位图也可以有颜色表的,该程序已考虑在内。 10.下面四种压缩格式暂不支持: BI_RLE8、BI_RLE4、BI_JPEG、BI_PNG 11.随带的附件中,有几张不同格式的位图,你可以试验打开查看。 有问题联系:hastings1986@163.com

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧