[Container] 存有pointer的vector使用iterator取內容

使用方式如下

vector<CObj*>::iterator iterEnd = cObj.end();
vector<CObj*>::iterator iter = --iterEnd;

string strData = (*iter)->GetData();

[Reg]登入後自動啟動程式

將需執行的程式之路徑寫到下列Registry Key底下即可
Current User:
\\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run

Local Machine:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

一樣可以加入command line來使用。

KeyValue的Type為String,KeyValue名稱可自定

已知所支援之平台:
XP、Vista、Server2008

[Win]Mapping Disk的紀錄位置

XP、Server2008、Vista、Win7:
Key:HKEY_CURRENT_USER\Network
ValueType:String
ValueName:Remote Path

[Win]在SystemTray Icon上跳出Pop-up Menu

一開始先加入Menu的resource,然後輸入所要顯示的項目。

之後將對應的ID加入到MessageMap裡面去,並且也需要建立對應的操作行為。
這邊所需要用到的Function為ON_COMMAND()
例如:
Message Map
BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
ON_COMMAND(ID_TRAYMENU_MAXIMIZE, OnTraymenuMax)
ON_COMMAND(ID_TRAYMENU_MINIMIZE, OnTraymenuMin)
ON_COMMAND(ID_TRAYMENU_CLOSE, OnTraymenuClose)
ON_COMMAND(ID_TRAYMENU_SHOWBALLOON, &CMDXMainDlg::OnTraymenuShowballoon)
END_MESSAGE_MAP()

之後再宣告CMenu物件來使用。宣告位置在function或是header內都可以。

之後需要彈出menu時,僅需做下列步驟:
     this->m_pRClkMenu->LoadMenu(nMenuID);  
     this->m_pRClkMenu->GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, rect.left, rect.top, this, &rect);  
     this->m_pRClkMenu->Detach();    //這行也會讓menu消失

Maximum function
In Head file
afx_msg void OnTraymenuMax();


In Cpp
void CMainDlg::OnTraymenuMax()
{
this->ShowMainForm();
}


不過目前跳出來的Pop-up menu在focus離開後並不會自行消失,且無法使用HotKey,所以這邊之後有時間再補上。

2009/12/08 - 註記
Pop-up menu不會消失的問題,只需在顯示pop-up menu之前多加個main form的SetForegroundWindow()就可以解決了。

[MFC]比較安全的殺Modeless Dialog方法

在結束dialog之前,先在PostNcDestroy()內下PostMessage()或是SendMessage給()Parent Dialog來將pointer設成NULL。
之後再刪除this,這樣也比較不會發生modeless dialog內的destructor動作沒做完前,因Parent Dialog刪除modeless dialog而造成不定時的crash事件。

PostNcDestroy可以在IDDProperties裡面設定就可用了

Sample code
PostNcDestory
void CMDXBatchJobManagerDlg::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class

CDialog::PostNcDestroy();

::AfxGetMainWnd()->PostMessage(WM_MDLESSDLG_CLOSE);
//::AfxGetMainWnd()->SendMessage(WM_MDLESSDLG_CLOSE);

delete this;
}

OnPostMessage
LRESULT CMDXBatchJobManagerDlg::OnPostMessage(WPARAM wParam, LPARAM lParam)
{
m_pModelessDlg = NULL; //Set null. It will be delete by itself
return TRUE;
}


message map
in header file
#define WM_MDLESSDLG_CLOSE 10058 //Any unique value


in cpp
BEGIN_MESSAGE_MAP(CMDXBatchJobManagerDlg, CDialog)
ON_MESSAGE(WM_MDLESSDLG_CLOSE, PostNcDestroy)
END_MESSAGE_MAP()

Build docker image from multiple build contexts

Build docker image from multiple build contexts ...