2011-06-07 61 views
1

我在这里遇到了问题。 我想从AVI文件获取信息,然后询问用户他想用它做什么。为此,我有对话框,在那里(除其他外)我有静态文本控件,我希望信息文本出现。代码:发送文本到静态控制

BOOL GetAviInfo(LPSTR szFileName) 
    { 
     AVIFileInit(); 

     PAVIFILE avi; 
     int res=AVIFileOpen(&avi, szFileName, OF_READ, NULL); 

     //some testing code 

     AVIFILEINFO avi_info; 
     AVIFileInfo(avi, &avi_info, sizeof(AVIFILEINFO)); 

     CString szFileInfo; 
     szFileInfo.Format( "Information about the AVI file: \n" 
       "Dimention: %dx%d\n" 
       "Max bytes per second: %d\n" 
       "Samples per second: %d\n" 
       "Streams: %d\n" 
       "File Type: %d" 
       "Length: %d frames\n\n" 
       "What do you want to do?", 
           avi_info.dwWidth, 
           avi_info.dwHeight, 
           avi_info.dwLength, 
           avi_info.dwMaxBytesPerSec, 
           (DWORD) (avi_info.dwRate/avi_info.dwScale), 
           avi_info.dwStreams, 
           avi_info.szFileType 
          ); 
     MessageBox(NULL, szFileInfo, "Info", MB_OK); //this works 
     int ret = DialogBox(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_AVIINF_DIALOG), aviinfhwnd, AviInfDlgProc); 
     SetDlgItemText(aviinfhwnd, AVIINF_STATIC_INFO, szFileInfo); //this doesnt work 

     AVIFileExit(); 
     return TRUE; 
    } 

所以我很困惑为什么发送Cstring到messagebox工作正常,而发送文本到静态控制doesnt。这两个函数(MessageBox和SetDlgItemText)都要求文本的相同数据类型(LPCTSTR)。我也试图通过WM_SETTEXT消息发送的文本,它没有工作,要么:

LPSTR lpstrChar= szFileInfo.GetBuffer(0); 
SendMessage(GetDlgItem(aviinfhwnd, AVIINF_STATIC_INFO), aviinfMsg, NULL, lpstrChar); 

请告诉我什么即时做错了,如何使文本出现在静态的,因为我不想使用该消息框(冗余窗口)。 谢谢

+0

一个问题是您传递的是**类型**的名称,而不是**变量**的名称。最后一行应该如下所示:'SendMessage(GetDlgItem(aviinfhwnd,AVIINF_STATIC_INFO),aviinfMsg,NULL,lpstrChar);' – 2011-06-07 16:07:55

+0

哦,当然,这是一个错字。在代码中我有你写的东西 – Smejki 2011-06-07 16:15:30

回答

2

DialogBox仅在对话结束后才会返回。 DialogBox返回一个hwnd,这是你应该发送消息的地方。

+0

啊,解决了,我不得不在对话框的消息循环中设置文本,这也意味着我必须全局使用Cstring。感谢您的建议,Mike – Smejki 2011-06-07 16:57:59

+0

如果您将调用更改为DialogBoxParam,则可以在其中传递一个指针,然后它将成为WM_INITDIALOG的lParam – 2011-06-07 17:02:48