VC 6 で GlobalMemoryStatusEx
#if(_MFC_VER >= 0x0700) #include <WinBase.h> #else #include <Windows.h> #include <TChar.h> // WinBase.h より typedef struct _MEMORYSTATUSEX { DWORD dwLength; DWORD dwMemoryLoad; DWORDLONG ullTotalPhys; DWORDLONG ullAvailPhys; DWORDLONG ullTotalPageFile; DWORDLONG ullAvailPageFile; DWORDLONG ullTotalVirtual; DWORDLONG ullAvailVirtual; DWORDLONG ullAvailExtendedVirtual; } MEMORYSTATUSEX, *LPMEMORYSTATUSEX; typedef BOOL (WINAPI *PFnGlobalMemoryStatusEx) (LPMEMORYSTATUSEX lpBuffer) ; //// //******************************************************************************* // クラス名:Kernel32.DLL ラッパー // 作成日 :’10/09/16 //******************************************************************************* class WrapKernel32 { public: WrapKernel32 () ; virtual ~WrapKernel32 () ; public: virtual BOOL GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) ; protected: HMODULE HLibrary ; PFnGlobalMemoryStatusEx FnGlobalMemoryStatusEx ; } ; //// //******************************************************************************* // 関数名 :コンストラクタ/デストラクタ // 作成日 :’10/09/16 //******************************************************************************* inline WrapKernel32::WrapKernel32 () { HLibrary = NULL ; FnGlobalMemoryStatusEx = NULL ; HLibrary = ::LoadLibrary (TEXT("Kernel32.DLL")) ; if (HLibrary == NULL) { return ; } FnGlobalMemoryStatusEx = (PFnGlobalMemoryStatusEx) GetProcAddress(HLibrary,("GlobalMemoryStatusEx")) ; } inline WrapKernel32::~WrapKernel32 () { if (HLibrary != NULL) { FreeLibrary(HLibrary) ; } } //// //******************************************************************************* // 関数名 :それぞれの呼び出し // 作成日 :’10/09/16 //******************************************************************************* inline BOOL WrapKernel32::GlobalMemoryStatusEx (LPMEMORYSTATUSEX lpBuffer) { if (FnGlobalMemoryStatusEx != NULL) { return FnGlobalMemoryStatusEx (lpBuffer) ; } return FALSE ; } inline BOOL WINAPI GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer) { if (lpBuffer->dwLength != sizeof(MEMORYSTATUSEX)) { #ifdef _DEBUG afxDump << _T("GlobalMemoryStatusEx ... dwLength != ") << sizeof(MEMORYSTATUSEX) << _T(" ") << lpBuffer->dwLength << _T("\r\n") ; #endif } WrapKernel32 wk32 ; return wk32.GlobalMemoryStatusEx(lpBuffer) ; } #endif // (_MFC_VER >= 0x0700)
EMF への保存
Displaying a Picture and Storing It in an Enhanced Metafile
http://msdn.microsoft.com/en-us/library/dd183568.aspx
2020/12
E_MF.hxx
EMF_fnc.hxx
DIB の縮小表示
サイズの大きな画像を縮小して表示すると汚くなる
SetStretchBltMode の指定が必要.
http://msdn.microsoft.com/ja-jp/library/cc428734.aspx
「応答なし」になり難くする
//*******************************************************************************
// 関数名 :時間がかかる時に,応答なしにならない様にする
// 作成日 :’07/10/05
//*******************************************************************************
BOOL WaitPeek (void)
{
MSG msg ;
::PeekMessage(&msg,NULL,0,0,PM_NOREMOVE) ;
return TRUE ;
}
//*******************************************************************************
// 関数名 :時間がかかる時に他に制御を回す
// 作成日 :’95/12/05
//*******************************************************************************
BOOL Wait (void)
{
MSG msg ;
for (int msgCnt=0 ; msgCnt < 1000 ; msgCnt++) {
if (::PeekMessage(&msg ,NULL,0,0,PM_REMOVE)) {
if (msg.message == WM_QUIT) {
return FALSE ;
}
::TranslateMessage(&msg) ;
::DispatchMessage(&msg) ;
continue ;
}
break ;
}
return TRUE ;
}
2011/11/02 追加
//*******************************************************************************
// 関数名 :時間がかかった時に,不要なイベントをスキップする
// 作成日 :’11/03/31
//*******************************************************************************
inline
BOOL EatMessage (const HWND wnd=NULL,const UINT skipWM=WM_TIMER)
{
MSG eatMsg;
while(::PeekMessage(&eatMsg,wnd,skipWM,skipWM,PM_REMOVE)) ;
return TRUE ;
}
Win7 srv 2017
ソース: srv
日付: 2010/01/08 21:15:09
イベント ID: 2017
タスクのカテゴリ: なし
レベル: エラー
キーワード: クラシック
ユーザー: N/A
コンピューター: T54W7U64
説明:
非ページ プール割り当ての制限に達したため、サーバーはシステムの非ページ プールから割り当てることができませんでした。
検索すると,
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesLanmanServerParameters]
"Size"=dword:00000003
"MaxMpxCt"=dword:000000ff
"MaxWorkItems"=dword:00000400
とある.
T54W7U64 の現在の設定は,
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesLanmanServerParameters]
"MaxNonPagedMemoryUsage"=dword:ffffffff
http://cid-535f5973454c1292.office.live.com/self.aspx/.Public/RegFiles/Win7^_SRV^_2017.zip
画像付 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