完整解决方案代码压缩包: test_full.zip (267.59 KB)

参考:

http://bbs.code.ijinshan.com/thread-1391-1-1.html

为了让更多的朋友能够让自己的程序使用上金山卫士的界面库,现将创建界面库的过程用文字说明,希望可以帮助到各位。如果觉得过程麻烦,也可以直接下载创建后的完整代码。

基本要求:安装WTL,下载地址:http://wtl.sourceforge.net/。下载解压后,到解压目录的AppWiz子目录下运行setup80.js(对应VS2005)即可安装完毕。

这是补充:要告诉VS2005编译器WTL下的头文件的位置。

工具->选项->VC++目录 在包含中加入    D:\WTL80_7161_Final\include

第一步、复制卫士界面库必要的文件

在VS2005中,单击菜单“文件”->“新建”->“项目”,在新建对话框中选择项目类型为“WTL”,模版只有一个“ATL/WTL Application Wizard”,选中它并在下方的编辑框中输入项目名和项目位置,这里假设创建后的目录为H:\MyProject\test。单击“确定”,在出现的向导中选择“下一步”,选择“Dialog Based”,并单击“Finish”按钮。

下载 (98.64 KB)

2011-9-30 17:27

在H:\MyProject\test\test下创建publish文件夹,然后到http://code.ijinshan.com下载金山卫士源代码,将其解压到某个目录,打开其子目录pcmanager\src\publish,将其下的bkres、bkwin、tinyxml和wtlhelper复制到H:\MyProject\test\test\publish下。

下载 (111.41 KB)

2011-9-30 17:29

第二步、添加包含目录

在VS2005的“解决方案资源管理器”中,右键点击test项目(注意是项目而不是解决方案),选择属性。

下载 (25.54 KB)

2011-9-30 17:31

在出现的“test属性页”对话框中,选择左边的“配置属性”->“C/C++”->“常规”项,在右边的“附加包含目录”中输入publish,点击“确定”保存设置。

下载 (109.83 KB)

2011-9-30 17:38

第三步、将Bkres、TinyXML加入项目中

在“解决方案资源管理器”中,右键点击“Resource Files”,选择“添加”->“现有项”,定位到publish\bkres目录下,将bkres.rc添加进项目。

下载 (19.21 KB)

2011-9-30 17:39

然后再在test项目上点击右键,选择“添加” -> “新建筛选器”,创建名为 publish 的筛选器,再在 publish 下创建 TinyXML 筛选器(创建筛选器只是为了分类方便,这一步可以略过,文件添加到任何一个筛选器中)。接下来用和以上相同的添加现有项的方法将 publish\tinyxml 下的所有文件添加到 TinyXML 筛选器下。

下载 (27.18 KB)

2011-9-30 17:39

第四步、去除TinyXML预编译头设置

展开publish\TinyXML筛选器,右键点击一个cpp文件,选择属性。

下载 (21.34 KB)

2011-9-30 17:40

点击左边的“配置属性”->“ C/C++ ” -> “预编译头”,将右边的“创建 / 使用预编译头”选项设置为“不使用预编译头”,点击“确定”。

下载 (75.72 KB)

2011-9-30 17:40

对TinyXML筛选器下所有cpp文件都执行这一步。

第五步,添加必要的代码

主要是替换默认生成的WTL基本对话框的代码,转而使用调用卫士界面库的代码,并且加入卫士界面库必需的定义XML相关文件和图片资源。此处为了方便起见,将代码打包,各位可以直接从附件中下载,将文件替换掉原先创建项目时自动生成的代码,然后将新增的bkwinres.h以及bkwinres.rc2添加到项目中即可。

这里可以看到_tMain函数中的

CMainDlg dlgMain;
dlgMain.DoModal();

而构建CMainDlg的方法是:

class CMainDlg  : public CBkDialogImpl<CMainDlg>
, public CWHRoundRectFrameHelper<CMainDlg>
{
public:
CMainDlg():CBkDialogImpl<CMainDlg>(IDR_BK_MAIN_DIALOG)
{
}
BK_NOTIFY_MAP(IDC_RICHVIEW_WIN)
BK_NOTIFY_ID_COMMAND(IDC_BTN_CLOSE, OnBtnClose)
BK_NOTIFY_ID_COMMAND(IDC_BTN_MIN, OnMinBtnClick)
BK_NOTIFY_MAP_END()
BEGIN_MSG_MAP(CMainDlg)
MSG_BK_NOTIFY(IDC_RICHVIEW_WIN)
CHAIN_MSG_MAP(CBkDialogImpl<CMainDlg>)
CHAIN_MSG_MAP(CWHRoundRectFrameHelper<CMainDlg>)
MSG_WM_SYSCOMMAND(OnCommand)
MSG_WM_INITDIALOG(OnInitDialog)
END_MSG_MAP()
protected:
LRESULT OnCommand(UINT wParam, CPoint point);
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam);
void OnBtnClose();
void OnMinBtnClick();
};

CBkDialogImpl  CWHRoundRectFrameHelper是金山开源软件中自定义的类,我们在看它们的实现.

template <class T>
class CWHRoundRectFrameHelper
{
protected:
SIZE m_sizeWnd;
void OnSize(UINT nType, CSize size)
{
T *pT = static_cast<T*>(this);
if (nType == SIZE_MINIMIZED)
return;
if (size == m_sizeWnd)
return;
CRect rcWindow, rcClient;
CRgn rgnWindow, rgnMinus, rgnAdd;
pT->GetWindowRect(rcWindow);
pT->GetClientRect(rcClient);
pT->ClientToScreen(rcClient);
rcClient.OffsetRect(- rcWindow.TopLeft());
rgnWindow.CreateRectRgn(rcClient.left, rcClient.top + 2, rcClient.right, rcClient.bottom - 2);
rgnAdd.CreateRectRgn(rcClient.left + 2, rcClient.top, rcClient.right - 2, rcClient.top + 1);
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.OffsetRgn(0, rcClient.Height() - 1);
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.SetRectRgn(rcClient.left + 1, rcClient.top + 1, rcClient.right - 1, rcClient.top + 2);
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
rgnAdd.OffsetRgn(0, rcClient.Height() - 3);
rgnWindow.CombineRgn(rgnAdd, RGN_OR);
//         rgnAdd.OffsetRgn(0, rcClient.Height());
//         rgnWindow.CombineRgn(rgnAdd, RGN_OR);
//         rgnMinus.CreateRectRgn(rcClient.left, rcClient.top, rcClient.left + 2, rcClient.top + 1);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(rcClient.Width() - 2, 0);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(0, rcClient.Height() - 1);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(3 - rcClient.Width(), 0);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//
//         rgnMinus.SetRectRgn(rcClient.left, rcClient.top, rcClient.left + 1, rcClient.top + 2);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(rcClient.Width() - 1, 0);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(0, rcClient.Height() - 2);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
//         rgnMinus.OffsetRgn(1 - rcClient.Width(), 0);
//         rgnWindow.CombineRgn(rgnMinus, RGN_DIFF);
pT->SetWindowRgn(rgnWindow);
m_sizeWnd = size;
}
public:
BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0)
{
BOOL bHandled = TRUE;
switch(dwMsgMapID)
{
case 0:
if (uMsg == WM_SIZE)
{
OnSize((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)));
lResult = 0;
}
break;
}
return FALSE;
}
};
//
// CBkDialogImpl
template <class T, class TBkView = CBkDialogView, class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CBkDialogImpl : public CWindowImpl<T, TBase, TWinTraits>
{
public:
static BOOL IsWinXPAndLater()
{
DWORD dwVersion = GetVersion();
DWORD dwMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
DWORD dwMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
if (dwMajorVersion > 5)         // Vista and later
return TRUE;
else if (dwMajorVersion < 5)    // 98/NT4 and before
return FALSE;
else if (dwMinorVersion > 0)    // XP and 2003
return TRUE;
else                            // 2000
return FALSE;
}
static ATL::CWndClassInfo& GetWndClassInfo()
{
static ATL::CWndClassInfo wc = {
{ sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | (IsWinXPAndLater() ? CS_DROPSHADOW : 0),
StartWindowProc, 0, 0, NULL, NULL, NULL,
(HBRUSH)(COLOR_WINDOW + 1), NULL, NULL, NULL },
NULL, NULL, IDC_ARROW, TRUE, 0, _T("")
};
return wc;
}
public:
CBkDialogImpl(UINT uResID = 0)
: m_uResID(uResID)
, m_bShowWindow(TRUE)
, m_bExitModalLoop(FALSE)
{
}
virtual ~CBkDialogImpl()
{
}
protected:
typedef CBkDialogImpl<T, TBkView, TBase, TWinTraits> __thisClass;
UINT m_uResID;
UINT m_uRetCode;
TBkView m_richView;
BOOL m_bShowWindow;
void ResizeClient(SIZE sizeClient, BOOL bRedraw)
{
ResizeClient(sizeClient.cx, sizeClient.cy, bRedraw);
}
void ResizeClient(int cx, int cy, BOOL bRedraw)
{
CRect rcWindow, rcClient;
CPoint ptWindow;
GetWindowRect(rcWindow);
GetClientRect(rcClient);
ptWindow = rcWindow.TopLeft();
rcWindow.MoveToXY(0, 0);
rcWindow -= rcClient;
rcClient.SetRect(0, 0, cx, cy);
rcWindow += rcClient;
rcWindow.MoveToXY(ptWindow);
MoveWindow(rcWindow, bRedraw);
}
void OnSize(UINT nType, CSize size)
{
CRect rcClient;
GetClientRect(rcClient);
if (SIZE_MINIMIZED != nType)
{
if (m_richView.m_hWnd)
m_richView.MoveWindow(rcClient);
}
SetMsgHandled(FALSE);
}
BOOL OnEraseBkgnd(CDCHandle dc)
{
return TRUE;
}
LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam)
{
if (bCalcValidRects)
{
CRect rcWindow;
GetWindowRect(rcWindow);
LPNCCALCSIZE_PARAMS pParam = (LPNCCALCSIZE_PARAMS)lParam;
if (SWP_NOSIZE == (SWP_NOSIZE & pParam->lppos->flags))
return 0;
if (0 == (SWP_NOMOVE & pParam->lppos->flags))
{
rcWindow.left = pParam->lppos->x;
rcWindow.top = pParam->lppos->y;
}
rcWindow.right = rcWindow.left + pParam->lppos->cx;
rcWindow.bottom = rcWindow.top + pParam->lppos->cy;
pParam->rgrc[0] = rcWindow;
pParam->rgrc[1] = pParam->rgrc[0];
}
return 0;
}
void OnGetMinMaxInfo(LPMINMAXINFO lpMMI)
{
HMONITOR hMonitor = ::MonitorFromWindow(m_hWnd, MONITOR_DEFAULTTONULL);
if (hMonitor)
{
MONITORINFO mi = {sizeof(MONITORINFO)};
::GetMonitorInfo(hMonitor, &mi);
CRect rcWork = mi.rcWork, rcMonitor = mi.rcMonitor;
lpMMI->ptMaxPosition.x = abs(rcWork.left - rcMonitor.left) - 1;
lpMMI->ptMaxPosition.y = abs(rcWork.top - rcMonitor.top) - 1;
lpMMI->ptMaxSize.x = abs(rcWork.Width()) + 2;
lpMMI->ptMaxSize.y = abs(rcWork.Height()) + 2;
lpMMI->ptMaxTrackSize.x = abs(rcWork.Width()) + 2;
lpMMI->ptMaxTrackSize.y = abs(rcWork.Height()) + 2;
}
}
BOOL OnNcActivate(BOOL bActive)
{
return TRUE;
}
public:
BOOL Load(UINT uResID)
{
CStringA strXml;
BOOL bRet = BkResManager::LoadResource(uResID, strXml);
if (!bRet)
return FALSE;
return SetXml(strXml);
}
BOOL SetXml(LPCSTR lpszXml)
{
return m_richView.SetXml(lpszXml);
}
HWND GetViewHWND()
{
return m_richView.m_hWnd;
}
BOOL SetPanelXml(UINT uItemID, UINT uResID)
{
return m_richView.SetPanelXml(uItemID, uResID);
}
BOOL SetPanelXml(UINT uItemID, LPCSTR lpszXml)
{
return m_richView.SetPanelXml(uItemID, lpszXml);
}
BOOL SetRichText(UINT uItemID, UINT uResID)
{
return m_richView.SetRichText(uItemID, uResID);
}
BOOL FormatRichText(UINT uItemID, LPCTSTR lpszFormat, ...)
{
va_list args;
CString strText;
va_start(args, lpszFormat);
strText.FormatV(lpszFormat, args);
return m_richView.SetRichText(uItemID, strText);
}
BOOL SetRichText(UINT uItemID, LPCWSTR lpszXml)
{
return m_richView.SetRichText(uItemID, lpszXml);
}
BOOL SetRichText(UINT uItemID, LPCSTR lpszXml)
{
return m_richView.SetRichText(uItemID, lpszXml);
}
BOOL SetItemText(UINT uItemID, LPCTSTR lpszText)
{
return m_richView.SetItemText(uItemID, lpszText);
}
CString GetItemText(UINT uItemID)
{
return m_richView.GetItemText(uItemID);
}
BOOL FormatItemText(UINT uItemID, LPCTSTR lpszFormat, ...)
{
va_list args;
CString strText;
va_start(args, lpszFormat);
strText.FormatV(lpszFormat, args);
return m_richView.SetItemText(uItemID, strText);
}
BOOL SetItemAttribute(UINT uItemID, LPCSTR lpszAttrib, LPCSTR lpszValue)
{
return m_richView.SetItemAttribute(uItemID, lpszAttrib, lpszValue);
}
BOOL GetItemRect(UINT uItemID, RECT &rcItem)
{
return m_richView.GetItemRect(uItemID, rcItem);
}
BOOL SetItemStringAttribute(UINT uItemID, LPCSTR lpszAttrib, LPCTSTR lpszValue)
{
return m_richView.SetItemStringAttribute(uItemID, lpszAttrib, lpszValue);
}
BOOL SetItemIntAttribute(UINT uItemID, LPCSTR lpszAttrib, int nValue)
{
return m_richView.SetItemIntAttribute(uItemID, lpszAttrib, nValue);
}
BOOL SetItemDWordAttribute(UINT uItemID, LPCSTR lpszAttrib, DWORD dwValue)
{
return m_richView.SetItemDWordAttribute(uItemID, lpszAttrib, dwValue);
}
BOOL SetItemColorAttribute(UINT uItemID, LPCSTR lpszAttrib, COLORREF crValue)
{
return m_richView.SetItemColorAttribute(uItemID, lpszAttrib, crValue);
}
BOOL GetItemCheck(UINT uItemID)
{
return m_richView.GetItemCheck(uItemID);
}
BOOL SetItemCheck(UINT uItemID, BOOL bCheck)
{
return m_richView.SetItemCheck(uItemID, bCheck);
}
BOOL IsItemEnable(UINT uItemID, BOOL bCheckParent = FALSE)
{
return m_richView.IsItemEnable(uItemID, bCheckParent);
}
BOOL EnableItem(UINT uItemID, BOOL bEnable)
{
return m_richView.EnableItem(uItemID, bEnable);
}
BOOL IsItemVisible(UINT uItemID, BOOL bCheckParent = FALSE)
{
return m_richView.IsItemVisible(uItemID, bCheckParent);
}
BOOL SetItemVisible(UINT uItemID, BOOL bVisible)
{
return m_richView.SetItemVisible(uItemID, bVisible);
}
BOOL SetTabCurSel(UINT uItemID, int nPage)
{
return m_richView.SetTabCurSel(uItemID, nPage);
}
int GetTabCurSel(UINT uItemID)
{
return m_richView.GetTabCurSel(uItemID);
}
BOOL SetTabTitle(UINT uItemID, int nPage, LPCTSTR lpszTitle)
{
return m_richView.SetTabTitle(uItemID, nPage, lpszTitle);
}
BOOL IsTabPageVisible(UINT uItemID, int nPage)
{
return m_richView.IsTabPageVisible(uItemID, nPage);
}
BOOL SetTabPageVisible(UINT uItemID, int nPage, BOOL bVisible)
{
return m_richView.SetTabPageVisible(uItemID, nPage, bVisible);
}
BOOL SetItemIconHandle(UINT uItemID, HICON hIcon)
{
return m_richView.SetItemIconHandle(uItemID, hIcon);
}
BOOL SetItemPaintHook(UINT uItemID, IBkWindowPaintHook* lpPaintHook)
{
return m_richView.SetItemPaintHook(uItemID, lpPaintHook);
}
void SetWindowCaption(LPCTSTR lpszCaption)
{
m_richView.SetWindowCaption(lpszCaption);
}
// Call at WM_INITDIALOG
void DontShowWindow()
{
m_bShowWindow = FALSE;
}
    HWND Create(HWND hWndParent = ::GetActiveWindow(), LPRECT rect = NULL)
{
        if (!m_richView.XmlLoaded())
{
if (0 == m_uResID || !Load(m_uResID))// 载入XML文件
            {
return NULL;
}
}
CRect rcWnd(0, 0, 0, 0);
LPCTSTR lpszCaption = m_richView.GetWindowCaption();
if (_T('\0') == lpszCaption[0])   // 加载标题
            lpszCaption = NULL;
if (rect)
rcWnd = rect;
HWND hWnd = __super::Create(hWndParent, rcWnd, lpszCaption, m_richView.GetDlgStyle(), m_richView.GetDlgExStyle());
if (!hWnd)
return NULL;
BkWinThemeFunc::SetWindowTheme(hWnd, L"", L"");
if (rect)
{
rcWnd.MoveToXY(0, 0);
m_richView.Create(m_hWnd, rcWnd, 0, 0, IDC_RICHVIEW_WIN);
}
else
m_richView.Create(m_hWnd, NULL, 0, 0, IDC_RICHVIEW_WIN);
m_bShowWindow = TRUE;
SendMessage(WM_INITDIALOG, (WPARAM)hWnd);
m_richView.ShowAllRealWindows(TRUE);
if (m_hWnd == hWnd)
{
SIZE sizeDefault = m_richView.GetDefaultSize();
if (sizeDefault.cx && sizeDefault.cy)
{
ResizeClient(sizeDefault, FALSE);
}
}
else
hWnd = m_hWnd;
return hWnd;
}
UINT_PTR DoModal(HWND hWndParent = NULL, LPRECT rect = NULL)
{
BOOL bEnableParent = FALSE;
if (NULL == hWndParent)
{
hWndParent = BkWinManager::GetActive();
if (NULL == hWndParent)
hWndParent = ::GetActiveWindow();
}
if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
{
::EnableWindow(hWndParent, FALSE);
bEnableParent = TRUE;
}
m_bExitModalLoop = FALSE;
HWND hWnd = Create(hWndParent, rect);
        if (!hWnd)
{
::EnableWindow(hWndParent, TRUE);
return 0;
}
HWND hWndLastActive = BkWinManager::SetActive(hWnd);
if (!rect)
CenterWindow();
if (m_bShowWindow)
{
::SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
}
_ModalMessageLoop();
m_bExitModalLoop = FALSE;
// From MFC
// hide the window before enabling the parent, etc.
if ( IsWindow() )
{
SetWindowPos(
NULL, 0, 0, 0, 0,
SWP_HIDEWINDOW | SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE | SWP_NOZORDER);
}
if (bEnableParent)
{
::EnableWindow(hWndParent, TRUE);
}
if (hWndParent != NULL && ::GetActiveWindow() == m_hWnd)
::SetActiveWindow(hWndParent);
BkWinManager::SetActive(hWndLastActive);
if ( IsWindow() )
DestroyWindow();
return m_uRetCode;
}
void OnClose()
{
SendMessage(WM_COMMAND, MAKELONG(IDCANCEL, 0), NULL);
}
void EndDialog(UINT uRetCode)
{
m_uRetCode = uRetCode;
m_bExitModalLoop = TRUE;
// DestroyWindow里面直接Send了WM_DESTROY,所以不会跑到DoModal的消息循环里,所以有了下面那行代码
// DestroyWindow();
// 这句非常重要,可以让DoModal消息循环再跑一次,防止卡死在GetMessage,泪奔~~~~~~~
::PostThreadMessage(::GetCurrentThreadId(), WM_NULL, 0, 0);
}
void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (IsWindowEnabled())
{
if (::GetKeyState(VK_CONTROL) >= 0)
{
if (VK_ESCAPE == nChar)
{
SendMessage(WM_COMMAND, MAKELONG(IDCANCEL, 0), NULL);
}
else if (VK_RETURN == nChar)
{
SendMessage(WM_COMMAND, MAKELONG(IDOK, 0), NULL);
}
}
SetMsgHandled(FALSE);
}
}
void OnOK(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl*/)
{
BKNMCOMMAND nms;
nms.hdr.code = BKNM_COMMAND;
nms.hdr.hwndFrom = m_hWnd;
nms.hdr.idFrom = IDC_RICHVIEW_WIN;
nms.uItemID = IDOK;
nms.szItemClass = "";
LRESULT lRet = ::SendMessage(m_hWnd, WM_NOTIFY, (LPARAM)nms.hdr.idFrom, (WPARAM)&nms);
}
void OnCancel(UINT /*uNotifyCode*/, int /*nID*/, CWindow /*wndCtl*/)
{
BKNMCOMMAND nms;
nms.hdr.code = BKNM_COMMAND;
nms.hdr.hwndFrom = m_hWnd;
nms.hdr.idFrom = IDC_RICHVIEW_WIN;
nms.uItemID = IDCANCEL;
nms.szItemClass = "";
LRESULT lRet = ::SendMessage(m_hWnd, WM_NOTIFY, (LPARAM)nms.hdr.idFrom, (WPARAM)&nms);
}
public:
virtual BOOL PreTranslateMessage(MSG* pMsg)
{
return FALSE;
}
protected:
BOOL m_bExitModalLoop;
void _ModalMessageLoop()
{
BOOL bRet;
MSG msg;
for(;;)
{
if (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (WM_QUIT == msg.message)
break;
}
if (m_bExitModalLoop || NULL == m_hWnd || !::IsWindow(m_hWnd))
break;
bRet = ::GetMessage(&msg, NULL, 0, 0);
if (bRet == -1)
{
continue;   // error, don't process
}
else if (!bRet)
{
ATLTRACE(L"Why Receive WM_QUIT here?\r\n");
break;   // WM_QUIT, exit message loop
}
if ( !PreTranslateMessage(&msg) )
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
}
BEGIN_MSG_MAP_EX(CBkDialogImpl)
MSG_WM_NCACTIVATE(OnNcActivate)
MSG_WM_ERASEBKGND(OnEraseBkgnd)
MSG_WM_NCCALCSIZE(OnNcCalcSize)
MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo)
MSG_WM_SIZE(OnSize)
MSG_WM_KEYDOWN(OnKeyDown)
MSG_WM_CLOSE(OnClose)
COMMAND_ID_HANDLER_EX(IDOK, OnOK)
COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
END_MSG_MAP()
};

在参考了文章《初步分析整理了xml文件与类之间的关联。分享给大家。》后

http://bbs.code.ijinshan.com/thread-1584-1-1.html

得到下图,希望对大家有帮助:

金山卫士开源软件之旅(二) 简单教程:如何创建一个基于金山卫士界面库的工程相关推荐

  1. 金山卫士开源软件之旅(十) KSafeMain工程的分析 1

    上一次看金山开源到现在已有一两个月了.期间看到QQ群里大家对它很是热情. 最近有时间想看看金山的主界面工程KSafeMain,自己水平有限,总结的东西浅显.但还是愿意拿来与大家分享.希望对大家有帮助. ...

  2. 金山卫士开源软件之旅(十) KSafeMainproject的分析 1

    上一次看金山开源到如今已有一两个月了.期间看到QQ群里大家对它非常是热情. 近期有时间想看看金山的主界面projectKSafeMain,自己水平有限,总结的东西浅显.但还是愿意拿来与大家分享.希望对 ...

  3. 金山卫士开源软件之旅(一) VS 2005环境下编译

    转载请标明是引用于 http://blog.csdn.net/chenyujing1234 参考文档: http://bbs.code.ijinshan.com/viewthread.php?tid= ...

  4. 简单教程:如何创建一个基于金山卫士界面库的工程

    上一篇  http://www.2cto.com/kf/201203/125262.html 完整解决方案代码压缩包:test_full.zip  http://up.2cto.com/2012/03 ...

  5. 开源公司黄页之阿里巴巴开源软件推荐(二)

    yugong--Oracle数据迁移同步工具 yugong 是阿里巴巴推出的去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS) 08年左右,阿里巴巴开始尝试MySQL的相关研究 ...

  6. 我的WCF之旅(1):创建一个简单的WCF程序

    http://www.cnblogs.com/artech/archive/2007/02/26/656901.html 为了使读者对基于WCF的编程模型有一个直观的映像,我将带领读者一步一步地创建一 ...

  7. revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序

    获取<每日一技,我的成长轨迹>汇总 · 请访问柏慕联创官方网站: www.lcbim.com · 创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS, ...

  8. Revit二次开发入门--创建一个简单的程序

    创建一个简单的Revit外部命令程序[Revit2017+VS2015]: 1.打开VS,我的版本是VS2015,点击[新建项目]→[Visual C#]→[类库],然后输入程序名称,如:Hello ...

  9. java调用jasper_Java开源报表Jasper入门(2) -- 使用JasperSoft Studio创建一个简单报表

    在接下来的教程中,我们将实现一个简单的JasperReports示例,展现其基本的开发.使用流程.文章很长,不过是以图片居多,文字并不多. 实例中使用最新的Jasper Studio5.2进行报表设计 ...

最新文章

  1. pandas使用isna函数和any函数计算返回dataframe中包含缺失值的数据行(rows with missing values in dataframe)
  2. Activity的插件化(三)
  3. golang 使用 http socks 代理
  4. Python学习day5作业
  5. springboot多模块项目,无法找到另一个模块的实体类
  6. 重复download CRM已经存在的parent equipment
  7. 在linux系统中查看组管理信息命令,Linux用户和组管理常用命令
  8. java中的垃圾回收机
  9. list的交集,差集,并集
  10. Android studio 权限大全
  11. STK之Commu模块之二-仿真同步卫星与地面站通信显示EIRP分布
  12. 计算机专业周记16篇,计算机专业实习周记10篇
  13. 怎么批量重命名文件夹?
  14. 解决Mac电脑无法读写ntfs硬盘分区的方法以及磁盘读写的简单方法
  15. Ubuntu系统中各文件夹的作用
  16. UE4-PixelStreaming(虚幻引擎4-像素流技术)笔记
  17. 4_竞赛无人机基本自动飞行支持函数与导航控制函数解析——零基础学习竞赛无人机搭积木式编程
  18. OpenVINO™基于人脸landmark检测实现眼睛疲劳/睡意检测
  19. Tesseract:识别知乎网站登录验证码
  20. ctr多少正常_你知道亚马逊的点击率多少算正常的吗?

热门文章

  1. wps怎么在后面加入表格_如何在WPS文档中插入表格
  2. python秒表倒计时模块
  3. 公安网计算机安全警示,阳原县公安局切实加强公安信息网络安全管理
  4. NSArray的用法
  5. Android开源项目:捕鱼达人游戏源代码
  6. 第2章 数据库关系模型---数据库原理及应用
  7. Golden Software Surfer 18中文版
  8. ES篇:ElasticSearch教程——创建索引、类型、文档
  9. Java自动化用例管理利器-TestNG详解
  10. js 16进制字符串 转 ArrayBuffer