【VC++】ダイアログの位置とサイズをiniファイルに保持する
<機能>
(1)WINDOWPLACEMENT構造体を使用します
・SetWindowPlacementで位置とサイズをセット
・GetWindowPlacementで位置とサイズを取得
(2)iniファイルをテスト用に自動生成します
(3)OnInitDialogでダイアログの位置とサイズを復元します
(4)OnDestroyでダイアログの位置とサイズを保持します
<動作検証&開発環境>
Visual Studio Community 2015
<使い方>
(1)windowPlacementTestプロジェクトを作成してください
・MFCアプリケーション
・ダイアログベース
(2)イベントを追加
・OnInitDialog
・OnDestroy(WM_DESTROY)
(3)メンバ関数を追加
・bExistFile(ファイルの存在チェック)
・GetIniSetting(iniファイルより情報取得)
(4)ソースをコピー
//windowPlacementTestDlg.h
class CwindowPlacementTestDlg : public CDialogEx
{
// コンストラクション
public:
CwindowPlacementTestDlg(CWnd* pParent = NULL); // 標準コンストラクター
// ダイアログ データ
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_WINDOWPLACEMENTTEST_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV サポート
// 実装
protected:
HICON m_hIcon;
// 生成された、メッセージ割り当て関数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnDestroy();
private:
CString csInifile;
BOOL bExistFile(CString csPath);
void GetIniSetting(WINDOWPLACEMENT &winplace);
};
//windowPlacementTestDlg.cpp
//定数定義
#define MAX_LEN 2048
BOOL CwindowPlacementTestDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// "バージョン情報..." メニューをシステム メニューに追加します。
// IDM_ABOUTBOX は、システム コマンドの範囲内になければなりません。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
// Framework は、この設定を自動的に行います。
SetIcon(m_hIcon, TRUE); // 大きいアイコンの設定
SetIcon(m_hIcon, FALSE); // 小さいアイコンの設定
//変数宣言
WINDOWPLACEMENT winplace;
CString csMsg;
FILE *fp;
//iniファイルのパスをcsInifile変数に保持
LPTSTR pBuff = csInifile.GetBuffer(MAX_LEN + 1);
GetModuleFileName(NULL, pBuff, MAX_LEN);
//.exeを.iniに置換
csInifile.GetBufferSetLength(wcslen(pBuff) - 3);
csInifile += L"ini";
//WINDOWPLACEMENT構造体に初期値をセット
ZeroMemory(&winplace, sizeof(WINDOWPLACEMENT));
//iniファイルの存在チェック
if (!bExistFile(csInifile)) {
//iniファイルが存在しないときファイルを生成する
WCHAR cwk[MAX_LEN];
wcscpy_s(cwk, MAX_LEN/sizeof(wchar_t), csInifile);
int err_no = _wfopen_s(&fp, cwk, L"wt");
fwrite("[WINDOWPLACEMENT]¥r¥n", wcslen(L"[WINDOWPLACEMENT]¥r¥n"),1, fp);
fwrite("length=0¥r¥n", wcslen(L"length=0¥r¥n"), 1, fp);
fwrite("flags=0¥r¥n", wcslen(L"flags=0¥r¥n"), 1, fp);
fwrite("ptMinPosition.x=0¥r¥n", wcslen(L"ptMinPosition.x=0¥r¥n"), 1, fp);
fwrite("ptMinPosition.y=0¥r¥n", wcslen(L"ptMinPosition.y=0¥r¥n"), 1, fp);
fwrite("ptMaxPosition.x=0¥r¥n", wcslen(L"ptMaxPosition.x=0¥r¥n"), 1, fp);
fwrite("ptMaxPosition.y=0¥r¥n", wcslen(L"ptMaxPosition.y=0¥r¥n"), 1, fp);
fwrite("rcNormalPosition.top=0¥r¥n", wcslen(L"rcNormalPosition.top=0¥r¥n"), 1, fp);
fwrite("rcNormalPosition.left=0¥r¥n", wcslen(L"rcNormalPosition.left=0¥r¥n"), 1, fp);
fwrite("rcNormalPosition.bottom=0¥r¥n", wcslen(L"rcNormalPosition.bottom=0¥r¥n"), 1, fp);
fwrite("rcNormalPosition.right=0¥r¥n", wcslen(L"rcNormalPosition.right=0¥r¥n"), 1, fp);
fclose(fp);
}else {
GetIniSetting(winplace);
BOOL bwk = this->SetWindowPlacement(&winplace);
}
return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。
}
/*************************************************
関数名 OnDestroy
機能 ダイアログの位置とサイズを取得して保持
*************************************************/
void CwindowPlacementTestDlg::OnDestroy()
{
CDialogEx::OnDestroy();
WINDOWPLACEMENT winplace;
WCHAR cwk[MAX_LEN];
//iniファイルの存在チェック
if (!bExistFile(csInifile)) {
//iniファイルが存在しないときは書き込みを行わない
return;
}
BOOL bwk = this->GetWindowPlacement(&winplace);
swprintf_s(cwk, L"%i", winplace.length);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"length", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.flags);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"flags", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.ptMinPosition.x);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"ptMinPosition.x", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.ptMinPosition.y);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"ptMinPosition.y", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.ptMaxPosition.x);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"ptMaxPosition.x", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.ptMaxPosition.y);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"ptMaxPosition.y", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.rcNormalPosition.top);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"rcNormalPosition.top", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.rcNormalPosition.left);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"rcNormalPosition.left", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.rcNormalPosition.bottom);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"rcNormalPosition.bottom", cwk, csInifile);
swprintf_s(cwk, L"%i", winplace.rcNormalPosition.right);
WritePrivateProfileString(L"WINDOWPLACEMENT", L"rcNormalPosition.right", cwk, csInifile);
}
/*************************************************
関数名 bExistFile
機能 ファイル・フォルダの存在をチェック
戻り値 TRUE:存在する FALSE:存在しない
*************************************************/
BOOL CwindowPlacementTestDlg::bExistFile(CString csPath)
{
//存在チェック
CFileFind fFind;
BOOL bFileExist;
bFileExist = fFind.FindFile(csPath);
fFind.Close();
return bFileExist;
}
/*************************************************
関数名 GetIniSetting
機能 ウィンドウの位置をiniファイルから読込
戻り値 WINDOWPLACEMENT構造体
*************************************************/
void CwindowPlacementTestDlg::GetIniSetting(WINDOWPLACEMENT &winplace)
{
winplace.length = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"length", 0, csInifile);
winplace.flags = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"flags", 0, csInifile);
winplace.ptMinPosition.x = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"ptMinPosition.x", 0, csInifile);
winplace.ptMinPosition.y = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"ptMinPosition.y", 0, csInifile);
winplace.ptMaxPosition.x = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"ptMaxPosition.x", 0, csInifile);
winplace.ptMaxPosition.y = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"ptMaxPosition.y", 0, csInifile);
winplace.rcNormalPosition.top = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"rcNormalPosition.top", 0, csInifile);
winplace.rcNormalPosition.left = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"rcNormalPosition.left", 0, csInifile);
winplace.rcNormalPosition.bottom = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"rcNormalPosition.bottom", 0, csInifile);
winplace.rcNormalPosition.right = GetPrivateProfileInt(L"WINDOWPLACEMENT", L"rcNormalPosition.right", 0, csInifile);
}
よろしければポチッと押してください