跳到主要內容

發表文章

目前顯示的是有「MFC」標籤的文章

%localappdata%

一般寫程式時會了將來除錯容易 通常會讓程式在執行過程中產生.log 檔案 若不想要讓end user看到這些檔案 我們可以將log產生在%localappdate%這個隱藏資料夾裡面 For example 實際路徑可能長這樣:  // C:\Users\User name\AppData\Local\MyProgram\DOTNETFX.log Sample code 如下:   CString dnetTagFilePath=getCurrentUserDirectory()+_T("\\DOTNETFX.log");   // C:\Users\User name\AppData\Local\MyProgram\DOTNETFX.log 定義getCurrentUserDirectory 並更改_stprintf (path, _T("%s\\ MyProgram "), path); CString CAppTools::getCurrentUserDirectory() {   CString szCurrentUserDirPath;   TCHAR path[MAX_PATH];   memset (path, 0, MAX_PATH*sizeof(TCHAR));   SHGetFolderPath (NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, path);   _stprintf (path, _T(" %s\\MyProgram "), path);   ::CreateDirectoryW (path, NULL);   szCurrentUserDirPath.Format(_T("%s"), path);   return szCurrentUserDirPath; }

[MFC] 進入桌面後自動執行程式

如果想要在進入桌面時 讓程式自動起來執行 基本上有兩種方法 1. 透過 Windows Task  scheduler 把程式叫起來 2. 在指定的 registry 路徑下註冊想要執行程式(這也本篇文章想要分享給各位的) 假設今天我想要每次進入桌面時,OS都會自動把APP.exe 叫起來執行的話 其實程式在安裝時可以在 registry的特定路徑Run底下寫入APP資訊如下   CRegKey keyReg;               CString strkey;      strkey.Format(_T( "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run" ));   if (keyReg.SetStringValue(_T( "APP_EXE_RUN" ), _T( "C:\\APP.exe" )) != ERROR_SUCCESS)                 {                    //fail                                      }    keyReg.Close();

[MFC] 使用Timer更新UI上的資訊

宣告 timer 資源 #define IDC_Timer   2948 宣告訊息映射函數 BEGIN_MESSAGE_MAP( WaitProceDlg , CDialog) ON_WM_TIMER() END_MESSAGE_MAP() 實作回呼函式 onTimer void WaitProceDlg::OnTimer(UINT_PTR nIDEvent) {          // TODO: Add your message handler code here and/or call default                 CDialog::OnTimer(nIDEvent); } 啟動 timer SetTimer(IDC_Timer,500,NULL);

[MFC] 修改字體大小(font size)

假設客戶的需求是希望UI的字體大小能在 runtime 時決定, 此時我們有兩種方式來修改font size: (這裡使用TextControl IDC_STATIC_1) 為例子 Way 1. 取得UI上的控件, 並呼叫SetFont() CFont m_font; / /設定大小為 4 m_ font.CreatePointFont (40 , L"Arial" ); //取得UI上的控件, 並呼叫SetFont() GetDlgItem ( IDC_STATIC_1 )->SetFont(m_font); Way 2. 透過 息映射(message mapping)函數  ON_WM_CTLCOLOR    Step 1.宣告訊息映射(message mapping)函數   BEGIN_MESSAGE_MAP(CTestDlg, CDialog)          ...           ON_WM_CTLCOLOR( )          ...      END_MESSAGE_MAP() Step 2. 實作回呼函式  OnCtlColor HBRUSH CTestDlg :: OnCtlColor ( CDC *  pDC, CWnd *  pWnd, UINT nCtlColor ) {         HBRUSH hbr  =  CDialog :: OnCtlColor (  pDC, pWnd, nCtlColor  ) ;          if ( p...