【VC++】ダイアログの位置とサイズをiniファイルに保持する

0

    <機能>

    (1)WINDOWPLACEMENT構造体を使用します

     ・SetWindowPlacementで位置とサイズをセット

     ・GetWindowPlacementで位置とサイズを取得

    (2)iniファイルをテスト用に自動生成します

    (3)OnInitDialogでダイアログの位置とサイズを復元します

    (4)OnDestroyでダイアログの位置とサイズを保持します

    VC,MFC,WINDOWPLACEMENT,ダイアログ,位置,サイズ,保持

     

    <動作検証&開発環境>
    Visual Studio Community 2015

     

    <使い方>

    (1)windowPlacementTestプロジェクトを作成してください

     ・MFCアプリケーション

     ・ダイアログベース

    VC,MFC,WINDOWPLACEMENT,ダイアログ,位置,サイズ,保持

    (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構造体に初期値をセット

        //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);

    }

     

    よろしければポチッと押してください

    プログラマー ブログランキングへ

     



    calendar

    S M T W T F S
    1234567
    891011121314
    15161718192021
    22232425262728
    293031    
    << October 2017 >>

    profile

    others

    mobile

    qrcode