画像付ファイル名のリストボックス
ヘッダファイルへの追加
#include “DImgS.hxx” または “DImg.hxx”
#include “ODrawDcM.hxx”
ListBoxDocMF m_ListDImage;
CArray <DImageS,DImageS> DImgAry ; または <DImage,…>
OnInitDialog など
m_ListDImage.SubclassDlgItem(IDC_XXXX_FILE_LIST,this) ;
m_ListDImage.Init() ;
m_ListDImage.ResetContent() ;
リストに表示するファイルの設定
DImgAry.RemoveAll() ;
for (int dIndex=0 ; dIndex<addFiles.GetSize() ; dIndex++) {
DImageS dImg ; または DImage
dImg.SetFileName(addFiles[dIndex]) ;
DImgAry.Add(dImg) ;
}
m_ListDImage.ResetContent() ;
for (int rIndex=0 ; rIndex<DImgAry.GetSize() ; rIndex++) {
CString fileName = DImgAry.GetAt(rIndex).GetFileName() ;
m_ListDImage.AddString(fileName,fileName) ;
// 以下は登録時に画像を付ける場合
CString mfName = CacheFile::GetCF_Name(fileName,1000) ;
if (::FileIsExist(mfName)) {
m_ListDImage.SetAtDocMF(rIndex,mfName) ;
}
else {
HICON icon = DImageS_GetIcon(fileName) ;
m_ListDImage.SetAtIcon(rIndex,icon) ;
}
}
DImageS クラスでなく DImage クラスを使用した場合は,ImageDMF クラスをサポートする形になる.
DImageS クラスでは,対応付けた EMF での動作になる.
現状の ListBoxDocMF では Shell Extension を利用できないみたい.
別のクラスを用意するか変更が必要.間にListBoxDocSE などを用意するか?
コントロールをサブクラス化した時のエラー
ダイアログのコントロールをサブクラス化した時の実行時エラーの対応.
m_ListXxx.SubclassDlgItem(IDC_Xxxx_LIST,this) ;
—————————
Microsoft Visual C++ Debug Library
—————————
Debug Assertion Failed!
Program: …\Xxxx\Xxxx\Debug\Xxxx.exe
File: wincore.cpp
Line: 321
For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.
(Press Retry to debug the application)
—————————
中止(A) 再試行(R) 無視(I)
—————————
以前 CListBox として使用していたので,変数として割り付けられていた.
変数を削除してOK.
FaceA::Search の高速化
データが増えると遅かったので改良
BOOL FaceA::Search(const long edgeS,const long edgeE,long* left_Face,long* rightFace) const
{
if (left_Face == NULL) { return FALSE ; }
if (rightFace== NULL) { return FALSE ; }
*left_Face = *rightFace = -1 ;
BOOL lfFound = FALSE ;
BOOL rfFound = FALSE ;
static long LastFace = 0 ;
int index = 0 ;
for (index=LastFace ; index<GetCount() ; index++) {
Face f = Faces[index] ;
if (!f.Search(edgeS,edgeE,&lfFound,&rfFound)) { continue ; }
if (*left_Face<0 && lfFound) { *left_Face = index ; }
if (*rightFace<0 && rfFound) { *rightFace = index ; }
if (*left_Face >= 0 && *rightFace>=0) {
LastFace = min(*left_Face,*rightFace) ;
return TRUE ;
}
}
for (index=0 ; index<GetCount() ; index++) {
Face f = Faces[index] ;
if (!f.Search(edgeS,edgeE,&lfFound,&rfFound)) { continue ; }
if (*left_Face<0 && lfFound) { *left_Face = index ; }
if (*rightFace<0 && rfFound) { *rightFace = index ; }
if (*left_Face >= 0 && *rightFace>=0) {
LastFace = min(*left_Face,*rightFace) ;
return TRUE ;
}
}
return FALSE ;
}
前に検索して一致した所から再検索するコードを追加.
CArray の要素のコピー
FaceA::FaceA (const FaceA& other)
{
// ループによるコピー
Faces.SetSize(other.Faces.GetSize()) ;
for (int index=0 ; index<other.Faces.GetSize() ; index++) {
Faces[index] = other.Faces[index] ;
}
// CArray::Copy
Faces.Copy(other.Faces) ;
}
VC 6 リリース版では体感できなかったが,少なくともデバッグ版では Copy の方がはるかに速かった.
VC 2010 $(IncludePath)
Microsoft.Cpp.Xxxx.user.props の場所
C:\Users\(UserName)\AppData\Local\Microsoft\MSBuild\v4.0
http://msdn.microsoft.com/ja-jp/library/ee855621.aspx
CImage::Draw 部分のメモ
// AtlImage.h より
inline BOOL CImage::Draw(
_In_ HDC hDestDC,
_In_ int xDest,
_In_ int yDest,
…
{
…
#if WINVER >= 0x0500
if( ((m_iTransparentColor != -1) || (m_clrTransparentColor != (COLORREF)-1)) && IsTransparencySupported() ) {
bResult = ::TransparentBlt( hDestDC, xDest, yDest, … , GetTransparentRGB() ) ;
}
else if( m_bHasAlphaChannel && IsTransparencySupported() ) {
BLENDFUNCTION bf;
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.SourceConstantAlpha = 0xff;
bf.AlphaFormat = AC_SRC_ALPHA;
bResult = ::AlphaBlend( hDestDC, xDest, yDest, … , bf) ;
}
else
#endif // WINVER >= 0x0500
{
bResult = ::StretchBlt( hDestDC, xDest, yDest, … , SRCCOPY) ;
}
…
return( bResult );
}
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 間での連絡先やスケジュール、名刺データの交換などに使用する。 |