按照不同的控件来分:
#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
嗯,能不能让它自动生成
如果实在不行的话,手动要怎么做。
@newlist:
我不明白你的自动生成是什么意思?
@程序猿.码农: 这个消息添加上去之后不是会相应生成一个OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)的函数吗,我想让VS05自动生成这个函数
@newlist: 哦,看这个吧 http://www.cppblog.com/xbgs/archive/2006/06/23/8940.html
@程序猿.码农: 这个我看过了,按照上面讲的做在VC环境下可以,但是VS下却找不到ON_WM_CTLCOLOR这个消息
@程序猿.码农: 能手动来开启这个消息吗,我该怎么做。
@newlist: 有啊,我刚测试了下,没问题。
@newlist: 可以啊,但是你得告诉我你用的是MFC,还是ATL,还是别的什么框架?
@程序猿.码农: 我创建的是一个dll的工程
@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;
}
@程序猿.码农: 有错误那
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”: 找不到标识符
@程序猿.码农: 是不是要包含什么头文件??
@newlist: afxmsg_.h
@程序猿.码农: 好像不行那,错误变多了
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: 无法从以前的错误中恢复;正在停止编译
@newlist: 你是用ATL建的项目吧
@程序猿.码农: 这个之前的程序员做的项目,是一个插件,现在变我负责,但是遇到了这个问题,我问了其他的工程师,他说建立的是dll工程,很不好意思,我是个菜鸟。
@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;
}
@程序猿.码农: 找到了,太感谢了,我想在这个函数里面返回一个空刷要怎么做,在这个函数好像没有CDC等的定义那
@newlist: HDC hdc = (HDC)wParam; 绘图句柄
LRESULT(GetStockObject(HOLLOW_BRUSH));
CDC也有,#include <atlgdi>
CDC dc(hdc);
@程序猿.码农: 我用webbrowser控件在对话框中嵌进了一个网页,但是每次往网页的文本框输入汉字的时候页面都会刷一下,没输入一个都会刷一下,你知道是怎么回事,我找了好久都没找出来。
@newlist: 输入数字或字母,页面会刷一下吗?
@程序猿.码农: 恩恩,没错,但是我一直找不到是什么原因。
@newlist: 直接在IE中打开页面输入会刷一下吗?
@程序猿.码农: 这个有测过,不会刷
@newlist: 查看你的代码,找到触发浏览器 Navigate 方法的代码。
@程序猿.码农: 我检索一下,只有一个地方,就在这个函数中
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; // 使系统设置焦点
}
@newlist: 这里是对话框初始化,只会调用一次,不是这里的问题。
@程序猿.码农: 但是整个工程中,就只有这个地方有调用到这个Navigate方法,还有其他原因会导致刷新吗。
@程序猿.码农: 嗯,可以了,太感谢了,多亏了你的指点,本来是一头雾水。