鱼C论坛

 找回密码
 立即注册
查看: 5398|回复: 7

在messagebox处卡死???而且textout输出的信息中有未定义的字符??

[复制链接]
发表于 2013-4-7 16:49:47 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 gwcome 于 2013-4-7 16:52 编辑

代码运行成功,是打印键盘消息的程序。。。已发现错误代码,就是不知道怎么改。。error代码已经注释
  1. #include <windows.h>
  2. #include <string>
  3. #include <vector>
  4. #pragma comment(lib, "winmm")
  5. #define  NUMLINES 50

  6. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

  7. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  8.                                         PSTR szCmdLine, int iCmdShow)
  9. {
  10.         TCHAR    szAppName[] = TEXT ("IconDemo") ;
  11.         HWND     hwnd ;
  12.         MSG      msg ;
  13.         WNDCLASS wndclass ;

  14.         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  15.         wndclass.lpfnWndProc   = WndProc ;
  16.         wndclass.cbClsExtra    = 0 ;
  17.         wndclass.cbWndExtra    = 0 ;
  18.         wndclass.hInstance     = hInstance ;
  19.         wndclass.hIcon         = LoadIcon (hInstance, IDI_APPLICATION) ;
  20.         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  21.         wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH) ;
  22.         wndclass.lpszMenuName  = NULL ;
  23.         wndclass.lpszClassName = szAppName ;

  24.         if (!RegisterClass (&wndclass))
  25.         {
  26.                 MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  27.                         szAppName, MB_ICONERROR) ;
  28.                 return 0 ;
  29.         }

  30.         hwnd = CreateWindow (szAppName, TEXT ("窗口"),
  31.                 WS_OVERLAPPEDWINDOW|WS_VSCROLL,
  32.                 CW_USEDEFAULT, CW_USEDEFAULT,
  33.                 CW_USEDEFAULT, CW_USEDEFAULT,
  34.                 NULL, NULL, hInstance, NULL) ;

  35.         ShowWindow (hwnd, iCmdShow) ;
  36.         UpdateWindow (hwnd) ;

  37.         while (GetMessage (&msg, NULL, 0, 0))
  38.         {
  39.                 TranslateMessage (&msg) ;
  40.                 DispatchMessage (&msg) ;
  41.         }
  42.         return msg.wParam ;
  43. }

  44. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  45. {

  46.         HDC  hdc ;
  47.         static int i=0 ,cxChar,cxCaps,cyChar,iMaxWidth,cxClient,cyClient,iVscrollPos;
  48.         int j;
  49.         static int nummessage=0;
  50.         static TCHAR szBuffer[NUMLINES][50];
  51.         static TCHAR *pmessage[]=
  52.         {
  53.                 TEXT("WM_KEYDOWN"),TEXT("WM_KEYUP"),TEXT("WM_CHAR"),TEXT("WM_DEADCHAR"),
  54.                 TEXT("WM_SYSKEYDOWN"),TEXT("WM_SYSKEYUP"),TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR")
  55.         };
  56.         CreateWindow (TEXT("button"), TEXT ("窗口"),
  57.                 WS_CHILD|WS_VISIBLE,
  58.                 CW_USEDEFAULT, CW_USEDEFAULT,
  59.                 CW_USEDEFAULT, CW_USEDEFAULT,
  60.                 NULL, NULL, NULL, NULL) ;
  61.         TEXTMETRIC tm;
  62.         static SCROLLINFO si;

  63.         switch (message)
  64.         {
  65.         case WM_CREATE:

  66.                 hdc = GetDC (hwnd) ;
  67.                 GetTextMetrics (hdc, &tm) ;
  68.                 cxChar = tm.tmAveCharWidth ;
  69.                 cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
  70.                 cyChar = tm.tmHeight + tm.tmExternalLeading ;
  71.                 ReleaseDC (hwnd, hdc) ;
  72.                 return 0 ;
  73.         case WM_SIZE:
  74.                 cxClient = LOWORD (lParam) ;
  75.                 cyClient = HIWORD (lParam) ;
  76.                 si.cbSize = sizeof (si) ;
  77.                 si.fMask = SIF_RANGE | SIF_PAGE ;
  78.                 si.nMin   = 0 ;
  79.                 si.nMax   = NUMLINES - 1 ;
  80.                 si.nPage = cyClient / cyChar ;
  81.                 SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
  82.                 return 0 ;

  83.         case WM_VSCROLL:
  84.                 si.cbSize=sizeof(si);
  85.                 si.fMask=SIF_ALL;
  86.                 GetScrollInfo(hwnd,SB_VERT,&si);
  87.                 iVscrollPos=si.nPos;
  88.                 switch (LOWORD (wParam))
  89.                 {
  90.                 case SB_TOP:
  91.                         iVscrollPos = si.nMin ;
  92.                         break ;
  93.                 case SB_BOTTOM:
  94.                         iVscrollPos = si.nMax ;
  95.                         break ;
  96.                 case SB_LINEUP:
  97.                         iVscrollPos -= 1 ;
  98.                         break ;
  99.                 case SB_LINEDOWN:
  100.                         iVscrollPos += 1 ;
  101.                         break ;
  102.                 case SB_PAGEUP:
  103.                         iVscrollPos-= si.nPage ;
  104.                         break ;
  105.                 case SB_PAGEDOWN:
  106.                         iVscrollPos += si.nPage ;
  107.                         break ;
  108.                 case SB_THUMBTRACK:
  109.                         iVscrollPos = si.nTrackPos ;
  110.                         break ;
  111.                 default:
  112.                         break ;         
  113.                 }
  114.                 iVscrollPos=max(0,min(iVscrollPos,NUMLINES-1));

  115.                 GetScrollInfo(hwnd,SB_VERT,&si);
  116.                 if (iVscrollPos !=si.nPos)
  117.                 {
  118.                         si.nPos=iVscrollPos;
  119.                         SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
  120.                         InvalidateRect(hwnd,NULL,TRUE);
  121.                 }
  122.                 return 0 ;


  123.         case WM_PAINT :
  124.                 {
  125.                         SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
  126.                         hdc=GetDC(hwnd);
  127.                         j=0;
  128.                         for (int i=iVscrollPos;i<nummessage;i++)
  129.                         {
  130.                                 TextOut(hdc,0,j*cyChar,szBuffer[i],50);//输出的内容包括很多,未定义的字符串
  131.                                 j++;
  132.                         }
  133.                         ReleaseDC(hwnd,hdc);
  134.                 }
  135.                 return 0 ;

  136.         case WM_DESTROY :

  137.                 PostQuitMessage (0) ;
  138.                 return 0 ;

  139.         case WM_KEYDOWN:
  140.         case WM_KEYUP:
  141.         case WM_CHAR:
  142.         case WM_DEADCHAR:
  143.         case WM_SYSKEYDOWN:
  144.         case WM_SYSKEYUP:
  145.         case WM_SYSCHAR:
  146.         case WM_SYSDEADCHAR:
  147.                 hdc=GetDC(hwnd);
  148.                 if (nummessage>NUMLINES-1)
  149.                 {
  150.                         MessageBox(hwnd,TEXT("您输入的信息过多,请从新运行程序\n"),0,MB_OK);//error 程序在此处卡死,为什么?????
  151.                         PostQuitMessage (0) ;
  152.                         return 0 ;
  153.                 }
  154.                 wsprintf(szBuffer[nummessage],TEXT("%s---%d----%d"),pmessage[message-WM_KEYDOWN],wParam,lParam);
  155.                 nummessage++;
  156.                 ReleaseDC(hwnd,hdc);
  157.                 return 0;

  158.         }
  159.         return DefWindowProc (hwnd, message, wParam, lParam) ;
  160. }
复制代码

最佳答案

查看完整内容

WM_PAINT消息处的hda要用beginpaint获取 TextOut最后一个参数是字符的个数,你写了50,所以后面有很多未知字符 如果要输入就输出,响应wm_char消息的地方也要用TextOut
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2013-4-7 16:49:48 | 显示全部楼层
WM_PAINT消息处的hda要用beginpaint获取
TextOut最后一个参数是字符的个数,你写了50,所以后面有很多未知字符
如果要输入就输出,响应wm_char消息的地方也要用TextOut
QQ截图20130407203311.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-7 19:26:08 | 显示全部楼层
座等大神来解决,帮忙顶上去让大神看到这个帖子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-7 20:32:05 | 显示全部楼层
有点错误,改后代码:
  1. #include <windows.h>
  2. #include <string>
  3. #include <vector>
  4. #pragma comment(lib, "winmm")
  5. #define  NUMLINES 50

  6. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

  7. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  8.         PSTR szCmdLine, int iCmdShow)
  9. {
  10.         TCHAR    szAppName[] = TEXT ("IconDemo") ;
  11.         HWND     hwnd ;
  12.         MSG      msg ;
  13.         WNDCLASS wndclass ;

  14.         wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  15.         wndclass.lpfnWndProc   = WndProc ;
  16.         wndclass.cbClsExtra    = 0 ;
  17.         wndclass.cbWndExtra    = 0 ;
  18.         wndclass.hInstance     = hInstance ;
  19.         wndclass.hIcon         = LoadIcon (hInstance, IDI_APPLICATION) ;
  20.         wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  21.         wndclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH) ;
  22.         wndclass.lpszMenuName  = NULL ;
  23.         wndclass.lpszClassName = szAppName ;

  24.         if (!RegisterClass (&wndclass))
  25.         {
  26.                 MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  27.                         szAppName, MB_ICONERROR) ;
  28.                 return 0 ;
  29.         }

  30.         hwnd = CreateWindow (szAppName, TEXT ("窗口"),
  31.                 WS_OVERLAPPEDWINDOW|WS_VSCROLL,
  32.                 CW_USEDEFAULT, CW_USEDEFAULT,
  33.                 CW_USEDEFAULT, CW_USEDEFAULT,
  34.                 NULL, NULL, hInstance, NULL) ;

  35.         ShowWindow (hwnd, iCmdShow) ;
  36.         UpdateWindow (hwnd) ;

  37.         while (GetMessage (&msg, NULL, 0, 0))
  38.         {
  39.                 TranslateMessage (&msg) ;
  40.                 DispatchMessage (&msg) ;
  41.         }
  42.         return msg.wParam ;
  43. }

  44. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  45. {

  46.         HDC  hdc ;
  47.         static int i=0 ,cxChar,cxCaps,cyChar,iMaxWidth,cxClient,cyClient,iVscrollPos;
  48.         int j;
  49.         static int nummessage=0;
  50.         static TCHAR szBuffer[NUMLINES][50];
  51.         static TCHAR *pmessage[]=
  52.         {
  53.                 TEXT("WM_KEYDOWN"),TEXT("WM_KEYUP"),TEXT("WM_CHAR"),TEXT("WM_DEADCHAR"),
  54.                 TEXT("WM_SYSKEYDOWN"),TEXT("WM_SYSKEYUP"),TEXT("WM_SYSCHAR"),TEXT("WM_SYSDEADCHAR")
  55.         };
  56.         CreateWindow (TEXT("button"), TEXT ("窗口"),
  57.                 WS_CHILD|WS_VISIBLE,
  58.                 CW_USEDEFAULT, CW_USEDEFAULT,
  59.                 CW_USEDEFAULT, CW_USEDEFAULT,
  60.                 NULL, NULL, NULL, NULL) ;
  61.         TEXTMETRIC tm;
  62.         static SCROLLINFO si;

  63.         switch (message)
  64.         {
  65.         case WM_CREATE:

  66.                 hdc = GetDC (hwnd) ;
  67.                 GetTextMetrics (hdc, &tm) ;
  68.                 cxChar = tm.tmAveCharWidth ;
  69.                 cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2;
  70.                 cyChar = tm.tmHeight + tm.tmExternalLeading ;
  71.                 ReleaseDC (hwnd, hdc) ;
  72.                 return 0 ;
  73.         case WM_SIZE:
  74.                 cxClient = LOWORD (lParam) ;
  75.                 cyClient = HIWORD (lParam) ;
  76.                 si.cbSize = sizeof (si) ;
  77.                 si.fMask = SIF_RANGE | SIF_PAGE ;
  78.                 si.nMin   = 0 ;
  79.                 si.nMax   = NUMLINES - 1 ;
  80.                 si.nPage = cyClient / cyChar ;
  81.                 SetScrollInfo (hwnd, SB_VERT, &si, TRUE);
  82.                 return 0 ;

  83.         case WM_VSCROLL:
  84.                 si.cbSize=sizeof(si);
  85.                 si.fMask=SIF_ALL;
  86.                 GetScrollInfo(hwnd,SB_VERT,&si);
  87.                 iVscrollPos=si.nPos;
  88.                 switch (LOWORD (wParam))
  89.                 {
  90.                 case SB_TOP:
  91.                         iVscrollPos = si.nMin ;
  92.                         break ;
  93.                 case SB_BOTTOM:
  94.                         iVscrollPos = si.nMax ;
  95.                         break ;
  96.                 case SB_LINEUP:
  97.                         iVscrollPos -= 1 ;
  98.                         break ;
  99.                 case SB_LINEDOWN:
  100.                         iVscrollPos += 1 ;
  101.                         break ;
  102.                 case SB_PAGEUP:
  103.                         iVscrollPos-= si.nPage ;
  104.                         break ;
  105.                 case SB_PAGEDOWN:
  106.                         iVscrollPos += si.nPage ;
  107.                         break ;
  108.                 case SB_THUMBTRACK:
  109.                         iVscrollPos = si.nTrackPos ;
  110.                         break ;
  111.                 default:
  112.                         break ;         
  113.                 }
  114.                 iVscrollPos=max(0,min(iVscrollPos,NUMLINES-1));

  115.                 GetScrollInfo(hwnd,SB_VERT,&si);
  116.                 if (iVscrollPos !=si.nPos)
  117.                 {
  118.                         si.nPos=iVscrollPos;
  119.                         SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
  120.                         InvalidateRect(hwnd,NULL,TRUE);
  121.                 }
  122.                 return 0 ;


  123.         case WM_PAINT :
  124.                 {
  125.                         SetScrollInfo(hwnd,SB_VERT,&si,TRUE);
  126.                         PAINTSTRUCT ps;
  127.                         hdc = BeginPaint(hwnd,&ps);
  128.                         //hdc=GetDC(hwnd);
  129.                         j=0;
  130.                         for (int i=iVscrollPos;i<nummessage;i++)
  131.                         {
  132.                                 TextOut(hdc,0,j*cyChar,szBuffer[i],wcslen(szBuffer[i]));//输出的内容包括很多,未定义的字符串
  133.                                 j++;
  134.                         }
  135.                         EndPaint(hwnd,&ps);
  136.                         //ReleaseDC(hwnd,hdc);
  137.                 }
  138.                 return 0 ;

  139.         case WM_DESTROY :

  140.                 PostQuitMessage (0) ;
  141.                 return 0 ;

  142.         case WM_KEYDOWN:
  143.         case WM_KEYUP:
  144.         case WM_CHAR:
  145.         case WM_DEADCHAR:
  146.         case WM_SYSKEYDOWN:
  147.         case WM_SYSKEYUP:
  148.         case WM_SYSCHAR:
  149.         case WM_SYSDEADCHAR:
  150.                 hdc=GetDC(hwnd);
  151.                 if (nummessage>NUMLINES-1)
  152.                 {
  153.                         MessageBox(hwnd,TEXT("您输入的信息过多,请从新运行程序\n"),0,MB_OK);//error 程序在此处卡死,为什么?????
  154.                         PostQuitMessage (0) ;
  155.                         return 0 ;
  156.                 }
  157.                 wsprintf(szBuffer[nummessage],TEXT("%s---%d----%d"),pmessage[message-WM_KEYDOWN],wParam,lParam);
  158.                 static int k=0;
  159.                 TextOut(hdc,0,k*cyChar,szBuffer[nummessage],wcslen(szBuffer[nummessage]));
  160.                 k++;
  161.                 nummessage++;
  162.                 ReleaseDC(hwnd,hdc);
  163.                 return 0;

  164.         }
  165.         return DefWindowProc (hwnd, message, wParam, lParam) ;
  166. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-7 21:54:07 | 显示全部楼层
好长啊!!      
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-7 21:57:03 | 显示全部楼层
帮顶~         
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-4-7 22:31:18 | 显示全部楼层

小新哥又帮了小弟一把
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-4-8 08:51:28 | 显示全部楼层
gwcome 发表于 2013-4-7 22:31
小新哥又帮了小弟一把

{:1_1:}楼主加油,鱼C加油!我们都看好你哦!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-8-4 10:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表