小女子大胆的在学winAPI,又遇到问题,好怪,请教各位大侠...
首先,从File菜单中选New。在 New对话框中,单击Projects页面标签,选择 Win32 Application,建立项目.然后将下面的代码复制到新source file. 执行看看.
本程序的功能是:在窗口分行显示一段中文文本,
有个很奇怪的现象,就是你轻轻在窗口边框拖动改变窗口大小时,它有时会出现乱码.
请教大侠们,办什么会这样?如何解决???
#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 ("SysMets1") ;
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 ("Get System Metrics No. 1"),
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 int cxChar, cxCaps, cyChar ;
HDC hdc ;
int i=0,nWords , nLines,nLen;
int xWnd;//窗口的宽度.
PAINTSTRUCT ps ;
TEXTMETRIC tm ;
//要显示的文本
TCHAR szBuffer []=TEXT("通过百般努力,局机关的下属事业单位宇宙工作部终于成立了。编委办还没正式下文,各路诸侯纷纷打电话给头儿,要求关照其七大姑八大姨进宇宙工作站。头儿每接到此类电话,总是哈哈一笑,对以“看情况吧”“以后再说”“还没定妥,不好说”“这个我有心无力啊”等等哼哈行话,含糊以应。只有一个电话,头儿不敢不高度重视,这个电话是地方老大(名词解释:县委书记,下同不赘)打来的。原来老大有个死党的女儿白女士在一个自收自支单位,想调进财政拨款单位来,她消息灵通得很,知道宇宙工作站成立在即,铁定要进人,于是找到老大,死党的女儿,老大岂有不帮,立即于百忙之中,电话打到头儿办公室,要头儿考虑考虑。头儿知道考虑考虑是什么意思,其实他早就在考虑了。原来白女士人情练达,头儿手机坏了,就“借”手机给头儿“暂时用着”,还认头儿作干爹,自家闺女,岂有不操心的,加上老大发话,更多了一个下级服从上级的由头,于是很快操办起这件事情来。");
switch (message)
{
case WM_CREATE:
return 0 ;
case WM_SIZE :
xWnd=LOWORD(lParam);
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
nLen=lstrlen(szBuffer);//文本的总长度
nWords=xWnd/cxChar; //一行能显示的字数
nLines=nLen/nWords ; //一共显示多少行,最后不满一行的不算.
//显示文本
for(i=0;i<nLines;i++)
TextOut(hdc,0,i*cyChar,szBuffer + i * nWords, nWords);
//剩下不够一行的字符最后输出
TextOut(hdc,0,i*cyChar,szBuffer + i * nWords, nLen - i*nWords);
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
问题点数:50、回复次数:23Top
1 楼xing_xing_xing(哈哈)回复于 2006-02-22 21:24:04 得分 6
改成Unicode
nWords如果是奇数,就会有乱码Top
2 楼ibm255(cheapchen)回复于 2006-02-22 21:27:17 得分 0
谢谢xingxingxing, 不过
请问如何改为Unicode? 我的文本里用了TEXT("..."),它不是改为了宽字符吗??
Top
3 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-02-22 21:27:54 得分 30
for(i=0;i<nLines;i++)
TextOut(hdc,0,i*cyChar,szBuffer + i * nWords, nWords);
//这里可能会将汉字切断,因为一个汉字是两个字节
TextOut(hdc,0,i*cyChar,szBuffer + i * nWords, nLen - i*nWords);Top
4 楼ibm255(cheapchen)回复于 2006-02-22 21:30:03 得分 0
另外,我也试过把
nWords=xWnd/cxChar;
改为:
nWords=(xWnd%cxChar ? xWnd/cxChar : xWnd/cxChar - 1);
以确保nWord为偶数,也不行哦,还是出现乱码...
怪...Top
5 楼ibm255(cheapchen)回复于 2006-02-22 21:31:23 得分 0
to vcmute(横秋):
如何解决呢??Top
6 楼iyaosan(aaaa)回复于 2006-02-22 21:36:28 得分 0
楼主能不能 小女子 三个字去了, 不要以为是女的,贴子就热,Top
7 楼iyaosan(aaaa)回复于 2006-02-22 21:41:16 得分 0
把楼主的代码 在 VS2003里试了,可正常 运行,Top
8 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-02-22 21:46:39 得分 4
nStart = 0;
//显示文本
for(i=0;i<nLines;i++)
{
nCurLen =0;
while(nCurLen<nWords)nCurLen+=szBuffer[nStart+nCurLen]&0x80?2:1;
TextOut(hdc,0,i*cyChar,szBuffer + nStart, nCurLen);
nStart += nCurLen;
}
//剩下不够一行的字符最后输出
TextOut(hdc,0,i*cyChar,szBuffer + nStart, nLen - nStart);
>请问如何改为Unicode? 我的文本里用了TEXT("..."),它不是改为了宽字符吗??
TEXT并不会自己转宽字符,要根据是否定义_UNICODE宏来决定使用哪种字符Top
9 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-02-22 21:47:50 得分 0
VS2003 可能默认定义了 _UNICODE宏Top
10 楼ibm255(cheapchen)回复于 2006-02-22 21:49:05 得分 0
没有 VS2003,只有vc6.0.Top
11 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-02-22 22:06:52 得分 0
用GetTextExtentExPoint好用点
i =0;
nStart = 0;
//显示文本
while(nStart<nLen)
{
SIZE sz;
GetTextExtentExPoint(hdc,szBuffer+nStart,nLen-nStart,xWnd,&nCurLen,NULL,&sz);
TextOut(hdc,0,cyChar*i++,szBuffer + nStart, nCurLen);
nStart += nCurLen;
} Top
12 楼ibm255(cheapchen)回复于 2006-02-22 22:09:43 得分 0
vcmute(横秋)的这行
while(nCurLen<nWords)nCurLen+=szBuffer[nStart+nCurLen]&0x80?2:1;
的szBuffer[nStart+nCurLen]&0x80?2:1 这句好像很妙,不过我还没看懂,
不过,我在开头定义unicode:
#define UNICODE
#include <windows.h>
就可以的哦Top
13 楼hollysky(爱神)回复于 2006-02-22 22:53:13 得分 10
Project -> Settings -> C/C++ -> Preprocessor Definitions
Add UNICODE Definition.Top
14 楼ice_tina(朵朵)回复于 2006-02-23 13:21:16 得分 0
同意楼上Top
15 楼ice_tina(朵朵)回复于 2006-02-23 13:23:17 得分 0
偶听了小女子就想起明清的小说,有点儿肉麻Top
16 楼rainlong(自变量)回复于 2006-02-23 14:18:47 得分 0
看来以后我也要开个人妖号问问题了,这样解决问题似乎爆快!Top
17 楼chenjuaxuan(轩)回复于 2006-02-23 15:15:24 得分 0
楼上的,不要这样吓人哟,呵呵.Top
18 楼LookSail(老得牙都掉了还在学)回复于 2006-02-24 01:15:29 得分 0
摆托,不管你是男是女,不要以小女子开头,有问题直接问就是了,非要加个这玩意,
到时候满CSDN都是
小女子请教
美女学编程的问题
小妹请教各位大哥
女程序员的问题
...............................Top
19 楼goodsun2()回复于 2006-02-24 01:50:11 得分 0
我在VS2003中运行代码,窗口弹出片刻后又错误提示“Run-Time Check Failure #3 - The variable 'xWnd' is being used without being defined.“,就是
nWords=xWnd/cxChar; //一行能显示的字数
是怎么回事?Top
20 楼mfkzj(鹰翔)回复于 2006-02-24 11:27:40 得分 0
哈哈 还是MM的帖子比较热 我也来凑个热闹Top
21 楼Atomictry(天影)回复于 2006-02-24 12:25:03 得分 0
老实说,已经热起来了。夏天到了,这里苍蝇蚊虫也多。Top
22 楼AAAAAANWJ(阿A)回复于 2006-02-24 14:27:13 得分 0
("通过百般努力,局机关的下属事业单位宇宙工作部终于成立了。编委办还没正式下文,各路诸侯纷纷打电话给头儿,要求关照其七大姑八大姨进宇宙工作站。头儿每接到此类电话,总是哈哈一笑,对以“看情况吧”“以后再说”“还没定妥,不好说”“这个我有心无力啊”等等哼哈行话,含糊以应。只有一个电话,头儿不敢不高度重视,这个电话是地方老大(名词解释:县委书记,下同不赘)打来的。原来老大有个死党的女儿白女士在一个自收自支单位,想调进财政拨款单位来,她消息灵通得很,知道宇宙工作站成立在即,铁定要进人,于是找到老大,死党的女儿,老大岂有不帮,立即于百忙之中,电话打到头儿办公室,要头儿考虑考虑。头儿知道考虑考虑是什么意思,其实他早就在考虑了。原来白女士人情练达,头儿手机坏了,就“借”手机给头儿“暂时用着”,还认头儿作干爹,自家闺女,岂有不操心的,加上老大发话,更多了一个下级服从上级的由头,于是很快操办起这件事情来。");
这断文字不错,不写小女子,这个贴子也能火起来.Top
23 楼CUG122032(烫烫烫烫烫烫?烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫?烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫)回复于 2006-02-24 15:47:43 得分 0
接分.Top




