ホーム » 2010 (ページ 2)
年別アーカイブ: 2010
画像付 RecentFile の追加
RecentFileMF クラスを利用して,画像でのメニュー表示を可能にする
- ODMenu を利用可能な様に追加する.
アプリケーションクラスのヘッダなどで MetaFile.hxx をインクルードして,ODMMetaFile を利用可能に. - ID_RECENT_FILE_00 ~ の必要数分のリソースを作成する.
- アプリケーションクラスのヘッダに,include と変数を追加する.
#include "RecentFM.hxx"
RecentFileMF RcntFM ; - アプリケーションクラスのコンストラクタに RecnetFileMF の初期化を追加する.
: RcntFM(_T("RecentFileMF"),30) - InitInstance で,RcntFM のデータを読込む処理を追加する.
{
RcntFM.Read() ;
RcntFM.SetStartID(ID_RECENT_FILE_00) ;
} - アプリケーションクラスに,範囲でコマンドハンドラを追加する.
ON_COMMAND_RANGE (ID_RECENT_FILE_00,ID_RECENT_FILE_29,OnRecentFile)
void CXxxxApp::OnRecentFile(UINT nID)
{
CString selFile = RcntFM.GetSelectFile(nID) ;
AfxGetApp()->OpenDocumentFile(selFile) ;
} - ドキュメントクラスのファイルの読み書きの時に,次の様にドキュメントと対応する画像を指定する.
{
CXxxxApp* app = (CXxxxApp*)AfxGetApp() ;
app->RcntFM.Add(fileName,emfName) ;
}
- さらに,ドキュメントに対するファイル名をステータスバーなどに表示するために,CMainFrame に追加する.
// ツールチップの表示データの更新
BOOL CMainFrame::OnToolTipText(UINT id, NMHDR *pNMHDR, LRESULT *pResult)
{
BOOL ret = CFrameWnd:: OnToolTipText(id,pNMHDR,pResult) ;
Prompt:: OnToolTipText(id,pNMHDR,pResult) ;
return ret ;
}
// ステータスバーの表示データの更新
void CMainFrame::GetMessageString(UINT nID, CString &rMessage) const
{
CFrameWnd:: GetMessageString(nID,rMessage) ;
Prompt:: GetMessageString(nID,rMessage) ;
}
2012/06/12 追記
VC6 でドロップタウンが有効にならない場合,CBRS_SIZE_DYNAMIC を外す.
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | …
… | CBRS_FLYBY/* | CBRS_SIZE_DYNAMIC*/) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
ODMenu が有効にならない場合,
#include “ODMenu.hxx”
#include “WinMFC.cxx”
Prompt が有効にならない場合,
#include “Prompt.hxx”
#include “RecentFM.cxx”
ODMenu は有効ではあるが,何も表示されない
手動で追加していたため,メッセージマップの修正漏れ
ON_WM_MEASUREITEM()
ON_WM_DRAWITEM()
2019/09/20
OnMeasureItem , OnDrawItem が呼ばれない.
内部的には ODMenu::ModifyMenu が呼ばれていない.
WinMFC.cxx を読み込む前に ODMenu.hxx が必要.
App.h 内の include の最後辺りに ODMenu.hxx の追加で対応可能.
ツールバーにドロップダウンボタン
ツール バー コントロールでのドロップダウン ボタンの使い方
http://msdn.microsoft.com/ja-jp/library/1ke6s1fc.aspx
上の方法だけでは,MFC のバージョンによりうまく動作しないので…
ToolBar.hxx
BOOL ToolBar::SetStyleDropDown (CToolBar* toolBar,int commandID)
MFC 6 では,CBRS_SIZE_DYNAMIC を無効にして.Create する必要あり.
2024/07/30
次を追加して,ドロップダウンにならなかった.
{
ToolBar::SetStyleDropDown(&m_wndToolBar, ID_EDIT_UNDO) ;
ToolBar::SetStyleDropDown(&m_wndToolBar, ID_EDIT_REDO) ;
}
原因は CBRS_SIZE_DYNAMIC が無効になっていなかったため.
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY
/* | CBRS_SIZE_DYNAMIC */
) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
ファイルを選択した状態で explorer.exe
explorer.exe /select,c:~exmple.txt
http://support.microsoft.com/kb/314853/ja
https://www.betaarchive.com/wiki/index.php?title=Microsoft_KB_Archive/314853
void CXxxxDoc::OnExecExplorer()
{
CString docName = GetPathName() ;
ShellExec se ;
se.SetNon2QMark(TRUE) ;
se.SetFile(_T("explorer.exe")) ;
se.SetParamaters(_T("/e,/select,")+docName) ;
se.Execute() ;
}
CChildFrame を最大化して表示
MDI の新規ウィンドウで ChildFrame を最大化して表示
BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs) { cs.style = WS_CHILD | WS_VISIBLE | WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | FWS_ADDTOTITLE | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_MAXIMIZE; if( !CMDIChildWnd::PreCreateWindow(cs) ) { return FALSE; } return TRUE; }
分割ウィンドウ CSplitterWnd
MDI 分割ウィンドウ
ChildFrm.cpp 内の CChildFrame::OnCreateClient で分割数などを指定している.
SDI は,CMainFrame::OnCreateClient
静的分割ウィンドウ
OnCreateClient 内のコードを書き換える.
/* // コメント部分はスケルトンで生成されたもの
return m_wndSplitter.Create( this,
2, 2, // TODO: 行と列の数を調整してください。
CSize( 10, 10 ), // TODO: 最小の区画サイズを調整してください。
pContext );
*/
if (!m_wndSplitter.CreateStatic(this,1,2)) {
return FALSE ;
}
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeft_View), CSize(150, 100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(100, 100), pContext)) {
m_wndSplitter.DestroyWindow(); // この部分は,どこに書かれていたか不明
return FALSE;
}
return TRUE ;
CString で保存される形式
UNICODE | FF FE FF | 04 | 32 00 | 30 00 | 31 00 | 30 00 |
MBCS | 04 | 32 | 30 | 31 | 30 |
// VC98\MFC\SRC\ArcCore.cpp
// CString serialization code
// String format:
// UNICODE strings are always prefixed by 0xff, 0xfffe
// if < 0xff chars: len:BYTE, TCHAR chars
// if >= 0xff characters: 0xff, len:WORD, TCHAR chars
// if >= 0xfffe characters: 0xff, 0xffff, len:DWORD, TCHARs
CArchive& AFXAPI operator<<(CArchive& ar, const CString& string)
{
// special signature to recognize unicode strings
#ifdef _UNICODE
ar << (BYTE)0xff;
ar << (WORD)0xfffe;
#endif
if (string.GetData()->nDataLength < 255) {
ar << (BYTE)string.GetData()->nDataLength;
}
else if (string.GetData()->nDataLength < 0xfffe) {
ar << (BYTE)0xff;
ar << (WORD)string.GetData()->nDataLength;
}
else {
ar << (BYTE)0xff;
ar << (WORD)0xffff;
ar << (DWORD)string.GetData()->nDataLength;
}
ar.Write(string.m_pchData, string.GetData()->nDataLength*sizeof(TCHAR));
return ar;
}
X02T Bluetooth Profile
HSP | Headset Profile | デバイスとBluetooth 対応ヘッドセットとの通信に使用する。 |
HFP | Hands-Free Profile | ハンズフリーデバイスで発呼および着呼する。 |
SPP | Serial Port Protocol | 2 台の Bluetooth 対応デバイスを接続する。 |
A2DP | Advanced Audio Distribution Profile | ステレオ品質のオーディオをメディア ソースからストリーミングする。 |
AVRCP | Audio/Video Remote Control Profile | TVやハイファイ設備、その他のデバイスを制御する(リモコンのような役割)。 |
HID | Human Interface Device | キーボードやマウス、ゲームデバイスなどに使用する。 |
OPP | Object Push Profile | 携帯電話間、または携帯電話と PC 間での連絡先やスケジュール、名刺データの交換などに使用する。 |
PSAPI
EnumProcesses
EnumProcessModules
GetModuleFileNameEx
http://cid-535f5973454c1292.office.live.com/self.aspx/.Public/MFC/PStatus.hxx.txt
プロセスID から,HWND を求める.
DWORD pid = processID ;
EnumWin ew ;
INT_PTR wCount = ew.GetCount() ;
for (INT_PTR wIndex=0 ; wIndex<wCount ; wIndex++) {
HWND hwnd = ew.GetWinHandle(wIndex) ;
DWORD wpid = 0 ;
GetWindowThreadProcessId(hwnd,&wpid) ;
if (pid == wpid) {
…
break ;
}
}
ビューのそのままを 1 ページに印刷
{
CXxxxDoc* pDoc = GetDocument();
CRect drawRect ;
GetClientRect(drawRect) ;
pDoc->Object.Draw(pDC,drawRect,…) ;
}
CXxxxView::OnPrint を追加.
void CXxxxView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CXxxxDoc* pDoc = GetDocument();
CRect drawRect ;
drawRect = pInfo->m_rectDraw ;
pDoc->Object.Draw(pDC,drawRect,…) ;
// CView::OnPrint(pDC, pInfo);
}
Shell_NotifyIcon
http://support.microsoft.com/kb/418138/ja
マウスの位置の取得
BOOL ::GetCursorPos(LPPOINT lpPoint) ;
http://cid-535f5973454c1292.office.live.com/self.aspx/.Public/MFC/NotifyI.hxx.txt
タスクバーのドキュメント
mk:@MSITStore:X:MSDNShellcc.chm::/platform/Shell/Shell_Int/Taskbar.htm
http://msdn.microsoft.com/ja-jp/library/cc144179(VS.85).aspx
hdc が拡張メタファイルのデバイスコンテキスト?
hdc が拡張メタファイルのデバイスコンテキストかどうかを調べるには、GetObjectType 関数
GetDeviceCaps
GetObjectType
メニューが左にポップアップ…
StringArrayToString と VC
以下のコードで,VC のそれぞれのバージョン,32 ビット MBCS/UNICODE で約 1 M 文字の変換を計測
BOOL O_StringArrayToString(const CStringArray& strAry,CString& str,const CString& sp=_T("rn"))
{
for (int lineCount=0 ; lineCount<strAry.GetSize() ; lineCount++) {
str += strAry.GetAt(lineCount) ;
if (str.Right(sp.GetLength()) != sp) {
str += sp ;
}
}
return TRUE ;
}
1+2 x 333,333 999,999 文字 |
10+2 x 83,333 999,996 文字 |
100+2 x 9,803 999,906 文字 |
1,000+2 x 998 999,996 文字 |
||
VC 6.0 | MB | 351.205 | 88.576 | 9.984 | 0.962 |
VC 7.0 | MB | 0.351 | 0.280 | 0.231 | 0.210 |
VC 7.1 | MB | 0.351 | 0.290 | 0.240 | 0.230 |
VC 8.0 | MB | 0.340 | 0.250 | 0.220 | 0.231 |
VC 9.0 | MB | 0.360 | 0.240 | 0.240 | 0.201 |
VC 10. | MB | 0.090 | 0.020 | 0.000 | 0.000 |
VC 6.0 | WC | 936.567 | 228.458 | 25.857 | 2.584 |
VC 7.0 | WC | 1.342 | 1.281 | 1.252 | 1.261 |
VC 7.1 | WC | 1.462 | 1.282 | 1.252 | 1.272 |
VC 8.0 | WC | 1.392 | 1.281 | 1.252 | 1.242 |
VC 9.0 | WC | 1.382 | 1.322 | 1.302 | 1.232 |
VC 10. | WC | 0.080 | 0.020 | 0.010 | 0.010 |
VC 10 は,ほとんど無視できる速度.
VC 7 ~ VC 9 は,UNICODE exe で少し時間がかかる.
VC 6 exe では,ループの回数にかなり影響を受ける
(恐らく領域の割り当ての関係と思われる).
また,CString のサイズが大きくなる(ループの lineCount が大きくなる)程,遅くなった.
綺麗なコードでないが,~ VC 9 の場合に置き換える
BOOL N_StringArrayToString(const CStringArray& strAry,CString& str,const CString& sp=_T("rn"))
{
CStringArray tmpSA ;
CString tmpStr ;
for (int lineCount=0 ; lineCount<strAry.GetSize() ; lineCount++) {
tmpStr += strAry.GetAt(lineCount) ;
if (tmpStr.Right(sp.GetLength()) != sp) {
tmpStr += sp ;
}
if ((lineCount%100-1) == 0) {
tmpSA.Add(tmpStr) ;
tmpStr.Empty() ;
}
}
if (!tmpStr.IsEmpty()) {
tmpSA.Add(tmpStr) ;
}
if (tmpSA.GetSize() > 1) {
::N_StringArrayToString(tmpSA,str,sp) ;
}
else if (tmpSA.GetSize() == 1) {
str = tmpSA[0] ;
}
else {
return FALSE ;
}
return TRUE ;
}
…/Test/TsSAtoS.zip