首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

Visual C++ 定制 AppWizard 進階實戰 (三):打造企業級專案模板,自動生成關於對話框與版權註釋

     編輯:關於VC++

目標:建立實用的高階 Custom AppWizard

輸入專案共用資訊(作者、網站、說明、註釋),自動:

  1. 生成客製化「關於」對話框(含超連結、Icon、Bitmap)
  2. 所有 .h/.cpp 檔案頂端自動加入版權註釋塊
  3. 資訊寫入註冊表,下次建立專案自動填入,免重複輸入

核心技術清單

  • 自定義步驟對話框 (Step Dialog)
  • Dictionary 巨集與模板佔位符 ($$MACRO$$) 綁定
  • 修改 newproj.inf、confirm.inf、資源模板 (dlgloc_chs.rc, loc_chs.rc)、Dlgres.h/resource.h
  • 新增模板檔 About.h, StatLink.h/cpp, HyprLink.h
  • 註冊表持久化巨集值 (CRegistry 封裝)

步驟 1:建立 Custom AppWizard 專案

  • 專案名:VckbaseWiz
  • 基於「Standard MFC AppWizard steps」
  • 顯示名:「MFC AppWizard (exe) — VC知識庫」
  • 額外步驟數:1 (自定義對話框)
  • 語言:中文 [中國] (APPWZCHS.DLL)

步驟 2:設計自定義對話框 (IDD_CUSTOM1)

控制項ID變數
程式設計師IDC_EDT_PROGRAMMERm_strProgrammer
Web 站點IDC_EDT_WEB_PAGEm_strWebPage
程式介紹IDC_EDT_GENERAL_INFOm_strGeneralInfo
代碼註釋IDC_EDT_COMMENT_INFOm_strCommentInfo

「程式介紹」「代碼註釋」設為 Multiline。

對話框初始化/存檔邏輯


// OnInitDialog: 從 Dictionary 讀取
VckbaseWizaw.m_Dictionary.Lookup("PROGRAMMER", m_strProgrammer);
VckbaseWizaw.m_Dictionary.Lookup("WEB_PAGE", m_strWebPage);
VckbaseWizaw.m_Dictionary.Lookup("GENERAL_INFO", m_strGeneralInfo);
VckbaseWizaw.m_Dictionary.Lookup("COMMENT_INFO", m_strCommentInfo);
UpdateData(FALSE);

// OnDismiss: 寫回 Dictionary + 產生日期巨集
VckbaseWizaw.m_Dictionary.SetAt("PROGRAMMER", m_strProgrammer);
VckbaseWizaw.m_Dictionary.SetAt("WEB_PAGE", m_strWebPage);
VckbaseWizaw.m_Dictionary.SetAt("GENERAL_INFO", m_strGeneralInfo);
VckbaseWizaw.m_Dictionary.SetAt("COMMENT_INFO", m_strCommentInfo);
CTime t = CTime::GetCurrentTime();
VckbaseWizaw.m_Dictionary["DATE_INFO"] = t.Format("%A, %B %d, %Y");
return TRUE;

步驟 3:新增模板檔 About.h

放入 Template/ 目錄,含 CAboutDlg 完整定義與超連結初始化 (Paul Dilascia 的 CStaticLink)。

步驟 4:修改 newproj.inf 控制檔案複製


// 於 Template 清單區加入
ABOUT.H     TEMPLATE DISCARDABLE "template\about.h"
VCKBASELOGO.BMP TEMPLATE DISCARDABLE "template\vckbaselogo.bmp"
HYPRLINK.H  TEMPLATE DISCARDABLE "template\HyprLink.h"
STATLINK.H  TEMPLATE DISCARDABLE "template\StatLink.h"
STATLINK.CPP TEMPLATE DISCARDABLE "template\StatLink.cpp"

// 複製邏輯:三種專案類型皆複製 (若對話框型勾選 About)
$$IF(PROJTYPE_DLG)
$$IF(ABOUT)
about.h about.h
HYPRLINK.H HyprLink.h
STATLINK.CPP StatLink.cpp
STATLINK.H StatLink.h
$$ENDIF
$$ELIF(PROJTYPE_MDI)
... (同上)
$$ELIF(PROJTYPE_SDI)
... (同上)
$$ENDIF

// 資源檔
=:root.ico res\APP.ico
=:VCKBASELOGO.BMP res\VCKBASELOGO.BMP

步驟 5:修改資源定義與模板

Dlgres.h / resource.h (ID 定義)


$$IF(PROJTYPE_DLG)
$$IF(ABOUT)
#define IDC_STATIC_ICON 1000
#define IDC_STATIC_TEXT 1001
#define IDC_STATIC_MAIL 1002
#define IDB_STATIC_IMG 129
$$ENDIF
$$ELIF(PROJTYPE_MDI) ... $$ELIF(PROJTYPE_SDI) ...
$$ENDIF
#define _APS_NEXT_RESOURCE_VALUE 130
#define _APS_NEXT_CONTROL_VALUE 1003

loc_chs.rc (SDI/MDI 關於對話框)


$$IF(ABOUT)
IDD_ABOUTBOX DIALOG DISCARDABLE 34, 22, 313, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "關於 $$ROOT$$"
FONT 9, "宋體"
BEGIN
  ICON IDR_MAINFRAME, IDC_STATIC_ICON, 11,10,21,21
  LTEXT "$$GENERAL_INFO$$", IDC_STATIC, 46,14,237,45
  CONTROL 129, IDB_STATIC_IMG, "Static", SS_BITMAP|WS_BORDER, 46,72,110,36
  LTEXT "@@VCKBASE 版權所有 (C) $$YEAR$$@@", IDC_STATIC, 187,83,106,8
  LTEXT "VC 知識庫\n$$WEB_PAGE$$", IDC_STATIC_TEXT, 187,97,73,16
  DEFPUSHBUTTON "@@確定@@", IDOK, 56,117,84,14,WS_GROUP
  LTEXT "@@與我們聯系@@", IDC_STATIC_MAIL, 187,119,58,8
END
$$ENDIF

dlgloc_chs.rc (對話框型主對話框加入「關於」按鈕)


$$IF(ABOUT)
PUSHBUTTON "@@關於(&A)@@", ID_APP_ABOUT, 260,45,50,14
$$ENDIF

步驟 6:所有 .h/.cpp 模板加入版權註釋塊


/////////////////////////////////////////////////////////////////////////////
// Project: $$ROOT$$
// Author:  $$PROGRAMMER$$
// Date:    $$DATE_INFO$$
// Description: $$COMMENT_INFO$$
/////////////////////////////////////////////////////////////////////////////

步驟 7:修改文檔/視圖與對話框模板移除預設 CAboutDlg,改用 About.h

  • root.cpp:刪除舊 CAboutDlg,OnAppAbout 呼叫 CAboutDlg().DoModal(),#include "about.h"
  • dialog.h/cpp:加入 OnAbout、訊息映射 ON_BN_CLICKED(ID_APP_ABOUT, OnAbout)、#include "about.h"

步驟 8:修改 confirm.inf 顯示自定義資訊


$$IF(PROJTYPE_DLG)
$$IF(ABOUT)
定制對話框信息:
作者:$$PROGRAMMER$$
網站:$$WEB_PAGE$$
程序說明:$$GENERAL_INFO$$
程序註釋:$$COMMENT_INFO$$
$$ENDIF
... (MDI/SDI 同理)

步驟 9:註冊表持久化巨集值

VckbaseWizAw.cpp 修改


#include "registry.h"
#define VCKBASEWIZ_KEY "Software\\VCKBASE\\VckbaseWiz"

static struct { char szMacro[50], szRegVal[50], szDef[1024]; } pairs[] = {
  {"PROGRAMMER","Programmer","程序員"},
  {"WEB_PAGE","Web Page","網站"},
  {"GENERAL_INFO","General Info","程序描述"},
  {"COMMENT_INFO","Comment Info","程序註釋"}
};

// InitCustomAppWiz 尾部
CRegistry reg(HKEY_LOCAL_MACHINE, VCKBASEWIZ_KEY);
CString val;
for (int i=0; i<_countof(pairs); i++) {
  if (reg.ReadString(pairs[i].szRegVal, val.GetBuffer(val.GetLength())))
    m_Dictionary.SetAt(pairs[i].szMacro, val);
  else {
    m_Dictionary.SetAt(pairs[i].szMacro, pairs[i].szDef);
    if (m_Dictionary.Lookup(pairs[i].szMacro, val))
      reg.WriteString(pairs[i].szRegVal, val.GetBuffer(val.GetLength()));
  }
}

// ExitCustomAppWiz 尾部
CRegistry reg2(HKEY_LOCAL_MACHINE, VCKBASEWIZ_KEY);
for (int i=0; i<_countof(pairs); i++)
  if (m_Dictionary.Lookup(pairs[i].szMacro, val))
    reg2.WriteString(pairs[i].szRegVal, val.GetBuffer(val.GetLength()));

測試成果

  1. Build 產生 VckbaseWiz.awx 自動複製到 VS Template 目錄
  2. 新建專案選「MFC AppWizard (exe) — VC知識庫」
  3. 最後一步出現自定義對話框
  4. 確認對話框顯示輸入資訊
  5. 執行專案,點「關於」按鈕
  6. 所有原始檔頂端自動帶入版權註釋
  7. 再次建立專案,資訊自動從註冊表填入

完整源碼下載:
AppWizard 專案 | 生成範例專案

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved