首页 新闻 会员 周边

求大虾,怎么在VS05中找不到WM_CTLCOLOR消息

0
悬赏园豆:5 [已解决问题] 解决于 2012-07-12 11:18

求大虾,怎么在VS05中找不到WM_CTLCOLOR消息

C++
一枚程序的主页 一枚程序 | 初学一级 | 园豆:108
提问于:2012-07-11 16:49
< >
分享
最佳答案
0

按照不同的控件来分:

#define WM_CTLCOLORMSGBOX               0x0132
#define WM_CTLCOLOREDIT                 0x0133
#define WM_CTLCOLORLISTBOX              0x0134
#define WM_CTLCOLORBTN                  0x0135
#define WM_CTLCOLORDLG                  0x0136
#define WM_CTLCOLORSCROLLBAR            0x0137
#define WM_CTLCOLORSTATIC               0x0138

WM_CTLCOLOR 也是存在的

// WM_CTLCOLOR for 16 bit API compatability
#define WM_CTLCOLOR     0x0019

收获园豆:5
Launcher | 高人七级 |园豆:45045 | 2012-07-11 17:51

嗯,能不能让它自动生成

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 17:53

如果实在不行的话,手动要怎么做。

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 17:55

@newlist: 

我不明白你的自动生成是什么意思?

Launcher | 园豆:45045 (高人七级) | 2012-07-11 17:55

@程序猿.码农: 这个消息添加上去之后不是会相应生成一个OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)的函数吗,我想让VS05自动生成这个函数

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 17:57
Launcher | 园豆:45045 (高人七级) | 2012-07-11 17:59

@程序猿.码农: 这个我看过了,按照上面讲的做在VC环境下可以,但是VS下却找不到ON_WM_CTLCOLOR这个消息

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:01

@程序猿.码农: 能手动来开启这个消息吗,我该怎么做。

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:03

@newlist: 有啊,我刚测试了下,没问题。

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:05

@newlist: 可以啊,但是你得告诉我你用的是MFC,还是ATL,还是别的什么框架?

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:06

@程序猿.码农: 我创建的是一个dll的工程

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:07

@newlist: 你跟我是两个星球的人。MFC的按照如下方式:

MESSAGE MAP中增加:

ON_WM_CTLCOLOR()

实现函数:

HBRUSH CXXXDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
 HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 // TODO:  在此更改 DC 的任何特性

 // TODO:  如果默认的不是所需画笔,则返回另一个画笔
 return hbr;
}

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:10

@程序猿.码农: 有错误那

1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(89) : error C2061: 语法错误 : 标识符“CDC”
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(54) : error C2143: 语法错误 : 缺少“;”(在“break”的前面)
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(51) : error C3861: “ON_WM_CTLCOLOR”: 找不到标识符

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:14

@程序猿.码农: 是不是要包含什么头文件??

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:14

@newlist: afxmsg_.h

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:15

@程序猿.码农: 好像不行那,错误变多了

1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(91) : error C2061: 语法错误 : 标识符“CDC”
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2065: “WM_CTLCOLOR”: 未声明的标识符
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2065: “AFX_PMSG”: 未声明的标识符
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2065: “AFX_PMSGW”: 未声明的标识符
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2059: 语法错误 : “函数样式转换”
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2653: “CWnd”: 不是类或命名空间名称
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : error C2645: 指向成员的指针没有限定名(找到“:: *”)
1>c:\users\administrator\desktop\trunk_2012_7_8\trunk\source\wy_oa_plugin\wy_ww_plugin\wy_ww_plugin\ie_browser.h(53) : fatal error C1903: 无法从以前的错误中恢复;正在停止编译

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:20

@newlist: 你是用ATL建的项目吧

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:22

@程序猿.码农: 这个之前的程序员做的项目,是一个插件,现在变我负责,但是遇到了这个问题,我问了其他的工程师,他说建立的是dll工程,很不好意思,我是个菜鸟。

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:24

@newlist: WM_CTLCOLOR是MFC的,如果是ATL/WTL项目,则没有此消息映射,而是应该这样做:

BEGIN_MSG_MAP(CMainDlg)
  MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)  

// 为每类控件单独映射消息,允许你映射到同一个处理函数

MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColorStatic)    

MESSAGE_HANDLER(WM_CTLCOLOREDIT, OnCtlColorStatic)

END_MSG_MAP()

LRESULT CMainDlg::OnCtlColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/)

{

return 0;
}

Launcher | 园豆:45045 (高人七级) | 2012-07-11 18:29

@程序猿.码农: 找到了,太感谢了,我想在这个函数里面返回一个空刷要怎么做,在这个函数好像没有CDC等的定义那

一枚程序 | 园豆:108 (初学一级) | 2012-07-11 18:48

@newlist: HDC hdc = (HDC)wParam; 绘图句柄

LRESULT(GetStockObject(HOLLOW_BRUSH));

 

CDC也有,#include <atlgdi>

CDC dc(hdc);

Launcher | 园豆:45045 (高人七级) | 2012-07-11 19:02

@程序猿.码农: 我用webbrowser控件在对话框中嵌进了一个网页,但是每次往网页的文本框输入汉字的时候页面都会刷一下,没输入一个都会刷一下,你知道是怎么回事,我找了好久都没找出来。

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 08:48

@newlist: 输入数字或字母,页面会刷一下吗?

Launcher | 园豆:45045 (高人七级) | 2012-07-12 09:05

@程序猿.码农: 恩恩,没错,但是我一直找不到是什么原因。

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 09:15

@newlist: 直接在IE中打开页面输入会刷一下吗?

Launcher | 园豆:45045 (高人七级) | 2012-07-12 09:19

@程序猿.码农: 这个有测过,不会刷

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 09:19

@newlist: 查看你的代码,找到触发浏览器 Navigate 方法的代码。

Launcher | 园豆:45045 (高人七级) | 2012-07-12 09:23

@程序猿.码农: 我检索一下,只有一个地方,就在这个函数中

LRESULT ie_browser_dlg::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
 CAxDialogImpl<ie_browser_dlg>::OnInitDialog(uMsg, wParam, lParam, bHandled);
 bHandled = TRUE;
 m_url_vect.clear();

 TCHAR tszModulePath[MAX_PATH + 1] = {0};
 GetModuleFileName(g_h_dll,tszModulePath, MAX_PATH);
 m_strModulePath.assign(tszModulePath);
 size_t n_pos = m_strModulePath.rfind(_T("\\"));
 if (n_pos != STRING::npos){
  m_strModulePath = m_strModulePath.substr(0, n_pos);
 }

 /*_sntprintf_s(m_tszUrl, MAX_PATH, _T("%s\\wy_oa.html"), strModulePath.c_str());*/
 CreateSimpleBrowser();

 if (m_pWeb2 && g_url_vect.size() > 0) {
  //MessageBox(g_url_vect[0].c_str());
  BSTR bstrText = _bstr_t(g_url_vect[0].c_str());
  m_pWeb2->Navigate(bstrText,NULL,NULL,NULL,NULL);
 } else if (m_url_vect.size() <= 0) {
#ifdef _MSG_BOX
  MessageBox(_T("没有设置配置文件的URL路径。"));
#endif
 }
 
 MoveWindow(0, 0, g_wnd_size.us_width, g_wnd_size.us_height);

 if (m_hAxWnd != NULL) {
  SetForegroundWindow(m_hAxWnd);
  ::SetFocus(m_hAxWnd);
  ::SetWindowPos(m_hAxWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
 }

 CAxWindow AxWin = GetDlgItem(IDC_EXPLORER);
 AxWin.MoveWindow(0, 0, g_wnd_size.us_width, g_wnd_size.us_height);
 AxWin.SetParent(this->m_hWnd);
 SetLayeredWindowAttributes(this->m_hWnd,RGB(0, 0, 0), 255, LWA_COLORKEY|LWA_ALPHA); 

 g_OldLongWinProc = (LRESULT)SetWindowLongPtr(GWL_WNDPROC,(LONG_PTR)NewWndProc);
 if (g_OldLongWinProc == NULL)
 {
  TCHAR msg[MAX_PATH] = {0};
  _sntprintf_s(msg, MAX_PATH - 1, _T("SetWindowLongPtr failed with error code(%d)."), GetLastError());
  MessageBox(msg);
 }

//  if (g_h_parentWnd != NULL)
//  {
//   AxWin.SetParent(g_h_parentWnd);
//  } else {
//   AxWin.SetParent(GetDesktopWindow());
//  }

 return 1;  // 使系统设置焦点
}

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 09:25

@newlist: 这里是对话框初始化,只会调用一次,不是这里的问题。

Launcher | 园豆:45045 (高人七级) | 2012-07-12 09:41

@程序猿.码农: 但是整个工程中,就只有这个地方有调用到这个Navigate方法,还有其他原因会导致刷新吗。

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 09:45

@程序猿.码农: 嗯,可以了,太感谢了,多亏了你的指点,本来是一头雾水。

一枚程序 | 园豆:108 (初学一级) | 2012-07-12 11:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册