CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

小女子大胆的在学winAPI,又遇到问题,好怪,请教各位大侠...

楼主ibm255(cheapchen)2006-02-22 20:52:18 在 VC/MFC / 基础类 提问

 
  首先,从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

相关问题

  • 小女子大胆的在学winAPI,开始就遇到问题,请教各位大侠...
  • 小女子遇到一个数据库更新的问题,请求大家解决
  • 小女子编程遇到了麻烦,恳请各位大虾帮忙看看错在哪了?
  • 大胆假设 [转}
  • winapi getwidowsdirectory
  • 一个大胆的设想
  • 当DELPHI遇到WORD!!!
  • 遇到了难题
  • 遇到难题了!!!
  • 遇到问题咯!

关键词

  • 字符
  • 文本
  • vs
  • unicode
  • null
  • wndclass
  • 请教
  • szappname
  • 头儿
  • usedefault

得分解答快速导航

  • 帖主:ibm255
  • xing_xing_xing
  • vcmute
  • vcmute
  • hollysky

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo