1

我已经成功地将 a 子类化CFileDialog并添加了一个带有一些控件的区域,这些控件使用SetTemplate(). 我的控制消息处理程序被正确调用。

根据键入的文件名,我的控件可能需要更新。OnFileNameChange()单击文件列表以及OnTypeChange()更改文件类型组合框时,我会得到。

但是,当简单地输入文件名时,我怎样才能得到通知?

我已经尝试将 a 添加PreTranslateMessage()到这个CFileDialog子类,但它没有被调用任何东西。我知道如何检查pMsg->message == WM_KEYDOWN,但如果我检测到一个,我怎么知道它是在文件输入字段中按下的键?而且由于钥匙还没有得到控制GetEditBoxText(),所以GetFileName()等。将无法工作......

我还尝试将以下内容添加到我的构造函数中:

OPENFILENAME& ofn = GetOFN();
ofn.lpfnHook = &OFNHook;

具有以下功能:

UINT_PTR CALLBACK OFNHook( HWND hdlg, UINT uiMsg,
                           WPARAM wParam, LPARAM lParam ) {

   if ( uiMsg == WM_KEYDOWN )  
       MyLogging( "here" );

   return 0;
}

OFNHook()被叫了很多,但uiMsg从来没有被平等过WM_KEYDOWN。所以与以前相同的问题:我如何知道文件字段的密钥,应用密钥后如何获取该文件字段的值等。

4

1 回答 1

0

这个解决方案感觉不好,但这就是我最终得到的:

1)做一个计时器:

BOOL WinTableEditFileDialog::OnInitDialog() {

  // There doesn't seem to be a way to get events for changes in the edit
  // field, so instead we check it on a timer.
  timerid = SetTimer( 1, 100, NULL );
}

2) 在计时器中,使用 GetPathName() 获取驱动器、目录路径,有时还有文件名。如果用户正在编辑它,然后使用 GetWindowText() 来获取文本字段中的确切文本。有时 GetPathName() 返回实时编辑(似乎,当上面没有选择文件时),有时不返回。所以,我检查一下两半,然后从一个或另一个或两者中得出一个结果。

void WinTableEditFileDialog::OnTimer( UINT_PTR nIdEvent ) {

  CComboBox* pcombo = (CComboBox*) GetParent()->GetDlgItem( cmb1 );

  // GetPathName() often doesn't update on text field edits, such as when
  // you select a file with the mouse then edit by hand.  GetWindowText()
  // does respond to edits but doesn't have the path.  So we build the full
  // name by combining the two.

  char szFull[1024];
  strncpy( szFull, sizeof( szFull ), GetPathName() );
  szFull[ sizeof( szFull ) - 1 ] = '\0';
  char* pcFile = strrchr( szFull, '\\' );
  if ( pcFile )
      pcFile++; // skip slash
  else
      pcFile = szFull;

  CComboBox* pcomboFileName = (CComboBox*) GetParent()->GetDlgItem( cmb13 );
  pcomboFileName->GetWindowText( pcFile, sizeof( szFull ) - ( pcFile-szFull ) );

  // If the user has typed a full path, then we don't need GetPathName();
  if ( isalpha( pcFile[0] ) && pcFile[1] == ':' )
      pcomboFileName->GetWindowText( szFull, sizeof( szFull ) );
于 2018-08-31T07:32:23.153 回答