【VC++】レジストリからWindows10のバージョン情報を取得する

<機能>

(1)RegOpenKeyExでレジストリをオープンします

   HKEY_LOCAL_MACHINE

   SOFTWARE¥Microsoft¥Windows NT¥CurrentVersion

(2)RegQueryValueExを使ってレジストリの値を取得します

   ProductName

   ReleaseId

   CurrentBuildNumber

   UBR

(3)Windows10のバージョン情報を表示します

Winver,WIndows10,バージョン情報表示,

 

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

 

<イメージ>

OS Windows 10 Enterprise

バージョン 1803

OSビルド 17134.345

 

Version情報,実行イメージ,ProductName,ReleaseId,CurrentBuildNumber,UBR,

 

<使い方>

(1)プロジェクトの選択でデスクトップウィザードを指定します

   アプリケーションの種類:コンソールアプリケーション

   共通ヘッダの追加:MFCにチェック

(2)コードを記述します

 

//プロトタイプ宣言
CString GetWindows10Version();
CString GetRegDataText(DWORD dwType, DWORD dwSize, TCHAR *buf, CString csEntry);
const int DMAX_SIZE = 256;

 

int main()
{
    if (hModule != nullptr)
    {
        // MFC を初期化して、エラーの場合は結果を印刷します。
        if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
        {
            //〜〜省略〜〜
        }
        else
        {

            //Window10のバージョン情報をレジストリから取得
            CString csRet = GetWindows10Version();
            //結果を出力
            AfxMessageBox(csRet, MB_ICONINFORMATION);
        }
    }
    else
    {
        //〜〜省略〜〜
    }

    return nRetCode;
}

 

/******************************************************
GetWindows10Version
レジストリからRegQueryValueExを使用してバージョン情報を取得する

 

戻り値
 バージョン情報(タイプ/サイズ/値)
******************************************************/

CString GetWindows10Version()
{
    HKEY hKey = nullptr; //レジストリキーのハンドル
    LONG lRet;
    CString csRet=_T("");
    TCHAR buf[DMAX_SIZE];
    DWORD dwSize,dwType,dwVal=0;

    //レジストリオープン
    lRet = RegOpenKeyEx(
        HKEY_LOCAL_MACHINE,
        _T("SOFTWARE¥¥Microsoft¥¥Windows NT¥¥CurrentVersion"),
        0,
        KEY_QUERY_VALUE,
        &hKey
    );
    //レジストリオープンエラー
    if (lRet != ERROR_SUCCESS)
    {
        csRet = _T("RegOpenKeyExエラー");
        goto lbl_Error;
    }

    //RegQueryValueExについてはDeveloperNetwork参照
    //// プロダクト(OS)を取得 //////////
    dwSize = DMAX_SIZE;
    ZeroMemory(&buf, DMAX_SIZE*2);
    lRet = RegQueryValueEx(
        hKey,
        _T("ProductName"),
        0,
        &dwType,
        (LPBYTE)buf,
        &dwSize
    );
    //プロダクト 値取得エラー
    if (lRet != ERROR_SUCCESS)
    {
        csRet = _T("RegQueryValueEx(ProductName)エラー");
        goto lbl_Error;
    }
    csRet = _T("【Windows Version情報】¥r¥n");
    csRet += GetRegDataText(dwType, dwSize, buf, _T("ProductName"));

 

    //// リリースIDを取得 //////////
    dwSize = DMAX_SIZE;
    ZeroMemory(&buf, DMAX_SIZE * 2);
    lRet = RegQueryValueEx(
        hKey,
        _T("ReleaseId"),
        0,
        &dwType,
        (LPBYTE)buf,
        &dwSize
    );
    //リリースID 値取得エラー
    if (lRet != ERROR_SUCCESS)
    {
        csRet = _T("RegQueryValueEx(ReleaseId)エラー");
        goto lbl_Error;
    }
    csRet += GetRegDataText(dwType, dwSize, buf,_T("ReleaseId"));

 

    //// ビルドバージョンを取得 //////////
    dwSize = DMAX_SIZE;
    ZeroMemory(&buf, DMAX_SIZE * 2);
    lRet = RegQueryValueEx(
        hKey,
        _T("CurrentBuildNumber"),
        0,
        &dwType,
        (LPBYTE)buf,
        &dwSize
    );
    //ビルドバージョン 値取得エラー
    if (lRet != ERROR_SUCCESS)
    {
        csRet = _T("RegQueryValueEx(CurrentBuildNumber)エラー");
        goto lbl_Error;
    }
    csRet += GetRegDataText(dwType, dwSize, buf, _T("CurrentBuildNumber"));

 

    //// ビルドバージョン(UBR)を取得 //////////
    dwSize = DMAX_SIZE;
    ZeroMemory(&buf, DMAX_SIZE * 2);
    lRet = RegQueryValueEx(
        hKey,
        _T("UBR"),
        0,
        &dwType,
        (LPBYTE)buf,
        &dwSize
    );
    //ビルドバージョン(UBR) 値取得エラー
    if (lRet != ERROR_SUCCESS)
    {
        csRet = _T("RegQueryValueEx(UBR)エラー");
        goto lbl_Error;
    }
    csRet += GetRegDataText(dwType, dwSize, buf, _T("UBR"));

lbl_Error:
    if (hKey != NULL)
    {
        //レジストリクローズ
        RegCloseKey(hKey);
    }
    return csRet;
}

/******************************************************
GetRegDataText
取得したタイプ(データ型)/サイズ/値より表示用文字列を生成

 

引数
 dwType  : タイプ(データ型)
 dwSize  : データサイズ
 buf     : レジストリの値
 csEntry : レジストリのエントリ名
戻り値
 表示用文字列
******************************************************/

CString GetRegDataText(DWORD dwType,DWORD dwSize,TCHAR *buf,CString csEntry)
{
    CString csRet = _T("¥r¥n=== ") + csEntry + _T(" ==========¥r¥n");
    CString cwk;
    int iwk;

    //読みだしたタイプに応じてサイズと値を設定
    //ここでは必要なタイプのみ設定するがタイプの詳細はDeveloperNetwork参照
    switch (dwType)
    {
    case REG_DWORD:
        iwk = (int)buf[0];
        cwk.Format(_T("   VALUE: %d¥r¥n   SIZE: %d  TYPE: REG_DWORD¥r¥n"), iwk, dwSize);
        break;
    case REG_SZ:
        cwk.Format(_T("   VALUE: %s¥r¥n   SIZE: %d  TYPE: REG_SZ¥r¥n"), buf, dwSize);
        break;
    }
   
    csRet += cwk;
    return csRet;
}

 

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


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


【VC++】非矩形のダイアログを作成する

0

    <機能>

    (1)CreateEllipticRgnで楕円形のリージョン(Crgn)を作成します

    (2)CreateRectRgnで四角形のリージョン(CRgn)を作成します

    (3)CombineRgnでリージョンを結合します

    (4)SetWindowRgnで非矩形ウィンドウを作成します

     

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

     

    <イメージ>

    元のダイアログ

    MFC,非矩形ウィンドウ,画面イメージ1

    [楕円1個]ボタン押下により楕円形のウィンドウに切り替え

    MFC,非矩形ウィンドウ,画面イメージ2

    [楕円2個]ボタン押下により楕円形2個のウィンドウに切り替え

    MFC,非矩形ウィンドウ,画面イメージ3

    [楕円くり抜き]ボタン押下により左右の矩形と楕円をXORしたウィンドウに切り替え

    MFC,非矩形ウィンドウ,画面イメージ4

    CombineRgnされた矩形ダイアログと楕円ダイアログのXOR部分が透明になります

    MFC,非矩形ウィンドウ,RGN_XOR,

     

    <使い方>

    (1)MFCアプリケーションでプロジェクトを作成

    (2)アプリケーションの種類でダイアログベースを選択

    MFC,非矩形ウィンドウ,ウィザード,アプリケーションの種類,

    (3)生成されたクラスで基底クラスにCDialogを選択

    MFC,非矩形ウィンドウ,ウィザード,生成されたクラス,

    (4)MFCApplication1.rcを下記の通り修正

    ※MFCApplication1は各環境のプロジェクト名

    MFC,非矩形ウィンドウ,ウィザード,ダイアログアプリの既存バグ修正,

    (5)クラスウィザードでWM_NCHITTESTメッセージを追加

    ※非矩形ウィンドウはタイトルバーがなくなるためタイトルバー以外でドラッグ移動できるようにする

    MFC,非矩形ウィンドウ,クラスウィザード,

    (6)ボタンを追加します(ダイアログの中央に集めてください)

    MFC,非矩形ウィンドウ,リソース追加,

    (7)ソースを追加します

     

    MFCApplication1Dlg.h
    // CMFCApplication1Dlg ダイアログ
    class CMFCApplication1Dlg : public CDialog
    {
        //〜〜省略〜〜
    private:
        int m_iTh;
        int m_iEw;
        int m_iEh;
        CRect m_Rect;
    public:
        afx_msg void OnBnClickedEllipse2();
        afx_msg void OnBnClickedEllipse1();
        afx_msg void OnBnClickedButton();
        afx_msg LRESULT OnNcHitTest(CPoint point);
    };

    MFCApplication1Dlg.cpp
    // CMFCApplication1Dlg メッセージ ハンドラー
    BOOL CMFCApplication1Dlg::OnInitDialog()
    {
        CDialog::OnInitDialog();
        //〜〜省略〜〜
        // クライアント領域(タイトルバーなどを除いた領域)のサイズを取得
        GetClientRect(&m_Rect);
        // タイトルバーの高さ
        m_iTh = GetSystemMetrics(SM_CYCAPTION);
        // ダイアログ枠線の幅
        m_iEw = GetSystemMetrics(SM_CXFRAME);
        // サイズ調整
        m_iEw += 5;
        // ダイアログ枠線の高さ
        m_iEh = GetSystemMetrics(SM_CYFRAME);
        // サイズ調整
        m_iEh += 5;
        return TRUE;
    }
    /*************************************************
    関数名 OnBnClickedNormal
    機能   [もとに戻す] ボタン押下イベント
    *************************************************/

    void CMFCApplication1Dlg::OnBnClickedNormal()
    {
        // ウィンドウを元に戻す
        SetWindowRgn(0, TRUE);
    }
    /*************************************************
    関数名 OnBnClickedEllipse1
    機能   [楕円1個] ボタン押下イベント
    *************************************************/

    void CMFCApplication1Dlg::OnBnClickedEllipse1()
    {
        CRgn rgn;
        int th = m_iTh + m_iEh;
        // 指定した領域(左上X座標,左上Y座標,右下X座標,右下Y座標)で楕円リージョンを作成
        rgn.CreateEllipticRgn(m_iEw, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
        // 非矩形ウィンドウを作成する
        SetWindowRgn(rgn, TRUE);
    }
    /*************************************************
    関数名 OnBnClickedEllipse2
    機能   [楕円2個] ボタン押下イベント
    *************************************************/

    void CMFCApplication1Dlg::OnBnClickedEllipse2()
    {
        CRgn rgn, rgn1, rgn2;
        int th = m_iTh + m_iEh;
        // 指定した領域(左上X座標,左上Y座標,右下X座標,右下Y座標)で楕円リージョンを作成
        rgn1.CreateEllipticRgn(m_iEw, th, (m_Rect.Width() / 2)+m_iEw, m_Rect.Height()+th);
        rgn2.CreateEllipticRgn((m_Rect.Width() / 2)+m_iEw, th, m_Rect.Width() + m_iEw, m_Rect.Height() + th);
        rgn.CreateRectRgn(0, 0, 1, 1);
        // 2つのリージョン(rgn1とrgn2)を結合する
        // 結合するときに実行する操作はDeveloperNetwork参照
        int iResult = rgn.CombineRgn(&rgn1, &rgn2, RGN_OR);
        if (iResult == ERROR || iResult == NULLREGION)
        {
            AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました", MB_ICONERROR);
            OnBnClickedNormal();
            return;
        }
        rgn1.DeleteObject();
        rgn2.DeleteObject();
        // 非矩形ウィンドウを作成する
        SetWindowRgn(rgn, TRUE);
    }
    /*************************************************
    関数名 OnBnClickedButton
    機能   [楕円くり抜き] ボタン押下イベント
    *************************************************/

    void CMFCApplication1Dlg::OnBnClickedButton()
    {
        CRgn rgn, rgn1, rgn2,rgn3;
        int th = m_iTh + m_iEh;
        int iResult;
        // 指定した領域で四角形リージョンを作成
        // 詳細はDeveloperNetwork参照
        rgn1.CreateRectRgn(m_iEw, th, 150, m_Rect.Height()+th);
        rgn2.CreateRectRgn(m_Rect.Width()-150, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
        rgn.CreateRectRgn(0, 0, 1, 1);
        // リージョンを結合する
        iResult = rgn.CombineRgn(&rgn1, &rgn2, RGN_OR);
        if (iResult == ERROR || iResult == NULLREGION)
        {
            AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました",MB_ICONERROR);
            OnBnClickedNormal();
            return;
        }
        // 指定した領域で楕円リージョンを作成
        rgn3.CreateEllipticRgn(m_iEw, th, m_Rect.Width()+m_iEw, m_Rect.Height()+th);
        // rgnにrgn3を結合する
        // 結合する際に実行する操作としてRGN_XORを指定(詳細はDeveloperNetwork参照)
        iResult = rgn.CombineRgn(&rgn, &rgn3, RGN_XOR);
        if (iResult == ERROR || iResult == NULLREGION)
        {
            AfxMessageBox(L"リージョン結合(CombineRgn)に失敗しました", MB_ICONERROR);
            OnBnClickedNormal();
            return;
        }
        rgn1.DeleteObject();
        rgn2.DeleteObject();
        rgn3.DeleteObject();
        // 非矩形ウィンドウを作成する
        SetWindowRgn(rgn, TRUE);
    }
    /*************************************************
    関数名 OnNcHitTest
    機能   タイトルバーがなくてもクライアント領域でウィンドウ移動を可能とする
    *************************************************/

    LRESULT CMFCApplication1Dlg::OnNcHitTest(CPoint point)
    {
        return HTCAPTION;
    }

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


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


    【VC++】CFile::GetStatusでファイルステータスを取得する

    0

      <機能>

      (1)ファイル選択ダイアログでファイルを指定します

      (2)指定ファイルのCFile::GetStatusでファイルステータスを取得します

       

      CFileStatus構造体
      CTime m_ctime ファイルの作成日時
      CTime m_mtime ファイルの最終更新日時
      CTime m_atime ファイルが読み取りで最後にアクセスされた日時
      ULONGLONG m_size ファイルの論理サイズ
      BYTE m_attribute ファイル属性
      char m_szFullName ファイルパス

       

      (3)ファイル属性(m_attribute)を取得します

      (4)ファイルステータスの取得結果をメッセージボックスで表示します

       

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

       

      <イメージ>

      CFile,GetStatus,CFileStatus,m_attribute,

       

      <使い方>

      (1)"Windowsデスクトップウィザード" を選択します

      (2)コンソールアプリケーション(.exe)を選択します

      (3)MFCにチェックを入れます

      CFile,GetStatus,ウィザード,

      (4)コードを記述します

       

      const int DMAX_FILEPATH = 4096;
      //プロトタイプ宣言
      BOOL GetAttribute(CString csBuff);
      BOOL GetFilePath(CString csCur, CString &csBuff);
      using namespace std;
      int main()
      {

          int nRetCode = 0;
          HMODULE hModule = ::GetModuleHandle(nullptr);
          if (hModule != nullptr)
          {

              //~~省略~~
              }
              else
              {

                  //バッファ宣言
                  CString csBuff("");
                  CString csCur("");
                 
                  //ファイル選択ダイアログの初期値に実行フォルダを指定
                  wchar_t wct[DMAX_FILEPATH];
                  ZeroMemory(&wct, sizeof(wct));
                  GetModuleFileName(NULL, wct, sizeof(wct));
                  CString cwk;
                  cwk.Format(L"%s",wct);
                  wchar_t c = L'¥u00A5'; //C4566警告対応
                  csCur = cwk.Left(cwk.ReverseFind(c));
                  //ファイル選択ダイアログでファイル指定
                  if(!GetFilePath(csCur,csBuff))
                  {
                      return nRetCode;
                  }
                  //ファイルの属性を取得する
                  if (!GetAttribute(csBuff))
                  {
                      return nRetCode;
                  }
              }
          }
          else
          {
              // TODO: 必要に応じてエラー コードを変更してください。
              wprintf(L"致命的なエラー: GetModuleHandle が失敗しました¥n");
              nRetCode = 1;
          }
          return nRetCode;
      }
      /***********************************************************
      GetAttribute
      ファイルの属性を取得する
      詳細はDeveloper Network(CFile::GetSatus)参照
      パラメータ
       csBuff : 選択ファイル
      戻り値
       true : CFileStatus取得成功
       false : CFileStatus取得失敗
      ***********************************************************/

      BOOL GetAttribute(CString csBuff)
      {
          CString csMsg(""), cwk("");
          CFileStatus status;
          CFile cfile;
          if (cfile.GetStatus(csBuff, status))
          {
              //CTimeオブジェクトを書式設定
              //ファイルパス
              cwk.Format(L"ファイルパス : %s¥n",status.m_szFullName);
              csMsg = cwk;
              //ファイルサイズ
              cwk.Format(L"ファイルサイズ : %I64uバイト¥n",status.m_size);
              csMsg += cwk;
              //ファイル作成日時
              cwk = status.m_ctime.Format(L"ファイルの作成日時 : %Y-%m-%d %H:%M:%S¥n");
              csMsg += cwk;
              //ファイル最終更新日時
              cwk = status.m_mtime.Format(L"ファイルの最終更新日時 : %Y-%m-%d %H:%M:%S¥n");
              csMsg += cwk;
              //ファイル最終アクセス日時
              cwk = status.m_atime.Format(L"ファイルの最終アクセス日時 : %Y-%m-%d %H:%M:%S¥n");
              csMsg += cwk;
              //アトリビュート(読み取り専用)
              if (status.m_attribute & CFile::readOnly)
              {
                  csMsg += L"CFile::readOnly(0x01)¥n";
              }
              //アトリビュート(隠しファイル)
              if (status.m_attribute & CFile::hidden)
              {
                  csMsg += L"CFile::hidden(0x02)¥n";
              }
              //アトリビュート(システムファイル)
              if (status.m_attribute & CFile::system)
              {
                  csMsg += L"CFile::system(0x04)¥n";
              }
              //アトリビュート(ディレクトリ)
              if (status.m_attribute & CFile::directory)
              {
                  csMsg += L"CFile::directory(0x10)¥n";
              }
          }
          else {
              return FALSE;
          }
          AfxMessageBox(csMsg,MB_ICONINFORMATION);
          return TRUE;
      }
      /***********************************************************
      SelectFile
      ファイルダイアログでファイルを選択する
      詳細はDeveloper Network(CFileDialog)参照
      パラメータ
       csCur[in] : ファイル選択ダイアログの初期表示フォルダ
       csBuff[out] : 選択ファイル
      戻り値
       true : ファイル選択ダイアログでファイルが選択された
       false : ファイル選択ダイアログでキャンセルされた
      ***********************************************************/

      BOOL GetFilePath(CString csCur,CString &csBuff)
      {
          csBuff = "";
          wchar_t *p = csBuff.GetBuffer(DMAX_FILEPATH);
         
          //ファイルを開くダイアログ:TRUE
          //ファイルを保存ダイアログ:FALSE
          CFileDialog dlg(TRUE);
          //OPENFILENAME構造体に値をセット
          OPENFILENAME &ofn = dlg.GetOFN();
          //ダイアログタイトル
          ofn.lpstrTitle = L"ファイルを1つ選択してください";
          //存在するファイル名のみ選択できる
          ofn.Flags |= OFN_FILEMUSTEXIST;
          //初期表示フォルダ
          ofn.lpstrInitialDir = csCur;
          //ファイル選択ダイアログ表示
          if (dlg.DoModal() != IDOK)
          {
              csBuff.ReleaseBuffer();
              return FALSE;
          }
          POSITION pos = dlg.GetStartPosition();
          csBuff = dlg.GetNextPathName(pos);
          wchar_t c = L'¥u00A5';  //C4566警告対応
          csCur = csBuff.Left(csBuff.ReverseFind(c));
          csBuff.ReleaseBuffer();
          return TRUE;
      }

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


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

       


      【VC++】SDIにマウスイベントで四角形を描画する

      0

        <機能>

        (1)MFCのSDIアプリケーションにマウスイベントを追加します

         WM_MOUSELEAVE : ウィンドウのクライアント領域を離れた

         WM_MOUSEMOVE : マウスカーソルが動いた

         WM_RBUTTONDOWN : マウスの右ボタンが押下された

         WM_RBUTTONUP : マウスの右ボタンが解放された

        (2)マウスの右ボタンでクライアント領域をドラッグすると四角形を描画します

         CDC->Rectangle

        (3)メニューで描画する四角形の塗りつぶし色、線の種類を変更できます

         塗りつぶし色

         ・赤系の色

         ・緑系の色

         ・青系の色

         線のスタイル

         ・実線(PS_SOLID)

         ・破線(PS_DASH)

         ・点線(PS_DOT)

         

        <実行イメージ>

        メニューを指定すると描画する四角形の色と線のスタイルが変更できます

        VisualStudio,MFC,C++,MOUSE,GetMenu,GetMenuState,
         

        マウスの右ボタン押下するとスタート位置セット、

        マウスの右ボタンUPすると終了位置をセットして四角形を描画します

        VisualStudio,MFC,C++,MOUSE,OnCommand,CheckMenuRadioItem,
         

        <動作検証&開発環境> 
        Visual Studio Community 2017 
         
        <使い方> 
        1.MFCアプリケーションでプロジェクトを作成 
        2.アプリケーションの種類でシングルドキュメントを選択 

        ※その他の設定は下図参照

        VisualStudio,MFC,C++,MOUSE,アプリケーションの種類,ウィザード,
        3.ユーザーインターフェイス機能でクラシックメニューを使用するを選択

        ※その他の設定は下図参照

        VisualStudio,MFC,C++,MOUSE,ユーザーインターフェイス,ウィザード,
         

        4.高度な機能で不要なチェックを外す

        VisualStudio,MFC,C++,MOUSE,高度な機能,ウィザード,
         

        5.プロジェクト構成を確認してソースを追加する

        VisualStudio,MFC,C++,MOUSE,ソリューションエクスプローラー,
        6.クラスウィザードでCChileViewクラスにマウスイベントハンドラを追加

        WM_MOUSELEAVE : クライアント領域の外にカーソルが移動したとき座標を初期化

        WM_MOUSEMOVE : 移動中のマウスカーソルを変更する

        WM_RBUTTONDOWN : マウスの右ボタンでスタート座標取得

        WM_RBUTTONUP : マウスの右ボタンUPで終了座標取得して描画

        VisualStudio,MFC,C++,MOUSE,クラスウィザード,マウスイベント追加,
         

        7.リソースの[Menu]->[IDR_MAINFRAME]を修正してメニュー項目を追加

        以下項目を追加します

         赤系の色 : ID_32771 

         緑系の色 : ID_32772 

         青系の色 : ID_32773

         ――境界線をセット――

         実線 : ID_32774

         破線 : ID_32775

         点線 : ID_32776

        ※塗りつぶし色と線のスタイルはCheckMenuRadioItemでそれぞれグループ化します

        VisualStudio,MFC,C++,MOUSE,Menu,Resource,
        メニューのIDはここではID_32771~ID32776ですがソース内もそれぞれの環境に応じて変更してください

         

        8.クラスウィザードでCMainFrameにOnCommandを追加します

        メニューが操作されたとき塗りつぶし色、線のスタイルを変更する

        VisualStudio,MFC,C++,MOUSE,クラスウィザード,CMainFrame,
         

         

        MFCApplication1.h
        class CMFCApplication1App : public CWinApp
        {
        //〜〜省略〜〜

         

        //グローバル変数
        public:
            //メニューでの選択値
            COLORREF selClr;
            COLORREF selLinfClr;
            int iSelStyle;
        };
        extern CMFCApplication1App theApp;


        MainFrm.h
        class CMainFrame : public CFrameWnd
        {
        //〜〜省略〜〜

         

        private:
            //塗りつぶしの色
            COLORREF clr[3] = {
                RGB(216,130,187),
                RGB(146,208,80),
                RGB(155,194,230)
            };
            //線の色
            COLORREF lineclr[3] = {
                RGB(199,73,157),
                RGB(97,148,40),
                RGB(47,117,181)
            };
            //線のスタイル
            int iStyle[3] = {
                PS_SOLID,
                PS_DASH,
                PS_DOT
            };

            
            virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam);
        };


        MainFrm.cpp
        #include "stdafx.h"
        #include "MFCApplication1.h"
        #include "MainFrm.h"

        //CMainFrameオブジェクト
        extern CMFCApplication1App theApp;

         

        int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
        {

            //〜〜省略〜〜

         

            CMenu *pMenu = this->GetMenu();
            //ON_COMMAND ハンドラーが自動的に無効になるのを停止
            CFrameWnd::m_bAutoMenuEnable = FALSE;
            //全てのメニューを有効化
            pMenu->EnableMenuItem(ID_32771, MF_BYCOMMAND | MF_ENABLED);
            pMenu->EnableMenuItem(ID_32772, MF_BYCOMMAND | MF_ENABLED);
            pMenu->EnableMenuItem(ID_32773, MF_BYCOMMAND | MF_ENABLED);
            pMenu->EnableMenuItem(ID_32774, MF_BYCOMMAND | MF_ENABLED);
            pMenu->EnableMenuItem(ID_32775, MF_BYCOMMAND | MF_ENABLED);
            pMenu->EnableMenuItem(ID_32776, MF_BYCOMMAND | MF_ENABLED);

            //色のメニューをグループ化して赤系にチェックOn

            //CheckMenuRadioItemについてはDeveloperNetwork参照
            pMenu->CheckMenuRadioItem(ID_32771, ID_32773, ID_32771, MF_BYCOMMAND);
            //線のメニューをグループ化して実線にチェックOn
            pMenu->CheckMenuRadioItem(ID_32774, ID_32776, ID_32774, MF_BYCOMMAND);
            //初期値をセット
            theApp.selClr = clr[0];
            theApp.selLinfClr = lineclr[0];
            theApp.iSelStyle = iStyle[0];

            return 0;
        }

        /***********************************************************
        OnCommand
        メニューが変更されたら塗りつぶし色、線の種類を変更

        ※環境に応じてメニューのIDは変更してください
        ***********************************************************/

        BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
        {
            int iSelClr = 0;
            int iSelStyle = 0;
            CMenu *pMenu = this->GetMenu();

            //現在(変更前)のメニューの状態を取得
            if (pMenu->GetMenuState(ID_32771, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 0;
            if (pMenu->GetMenuState(ID_32772, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 1;
            if (pMenu->GetMenuState(ID_32773, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelClr = 2;
            if (pMenu->GetMenuState(ID_32774, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 0;
            if (pMenu->GetMenuState(ID_32775, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 1;
            if (pMenu->GetMenuState(ID_32776, MF_BYCOMMAND | MF_CHECKED) & MF_CHECKED) iSelStyle = 2;

            //変更されたメニュー項目(iItem)で更新
            UINT iItem = LOWORD(wParam);
            switch (iItem)
            {
            case ID_32771:
                iSelClr = 0;
                break;
            case ID_32772:
                iSelClr = 1;
                break;
            case ID_32773:
                iSelClr = 2;
                break;
            case ID_32774:
                iSelStyle = 0;
                break;
            case ID_32775:
                iSelStyle = 1;
                break;
            case ID_32776:
                iSelStyle = 2;
                break;
            default:
                ;
            }

            //塗りつぶしグループの値を変更
            if (iItem == ID_32771 || iItem == ID_32772 || iItem == ID_32773)
            {
                pMenu->CheckMenuRadioItem(ID_32771, ID_32773, iItem, MF_BYCOMMAND);
                theApp.selClr = clr[iSelClr];
                theApp.selLinfClr = lineclr[iSelClr];
            }
            //線の種類グループの値を変更
            if (iItem == ID_32774 || iItem == ID_32775 || iItem == ID_32776)
            {
                pMenu->CheckMenuRadioItem(ID_32774, ID_32776, iItem, MF_BYCOMMAND);
                theApp.iSelStyle = iStyle[iSelStyle];
            }
            TRACE(L"iSelClr=%d iSelStyle=%d¥r¥n",iSelClr, iSelStyle);
            return CFrameWnd::OnCommand(wParam, lParam);
        }


        ChildView.h
        class CChildView : public CWnd
        {
        //〜〜省略〜〜

         

        public:
            afx_msg void OnRButtonDown(UINT nFlags, CPoint point);
            afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
            afx_msg void OnMouseMove(UINT nFlags, CPoint point);
            afx_msg void OnMouseLeave();

        private:
            void DrawRectangle();
            //描画中フラグ(描画中のときTRUE)
            BOOL bDrawing;
            //座標情報
            CPoint stPoint, edPoint;
        };

         

        ChildView.cpp
        #include "stdafx.h"
        #include "MFCApplication1.h"
        #include "ChildView.h"

        //CMainFrameオブジェクト
        extern CMFCApplication1App theApp;

        BEGIN_MESSAGE_MAP(CChildView, CWnd)
            //〜〜省略〜〜
            ON_WM_RBUTTONDOWN()
            ON_WM_RBUTTONUP()
            ON_WM_MOUSEMOVE()
            ON_WM_MOUSELEAVE()
        END_MESSAGE_MAP()

         

        /***********************************************************
        OnRButtonDown
        子ウィンドウでマウスの右ボタンが押下されたイベント
        ***********************************************************/

        void CChildView::OnRButtonDown(UINT nFlags, CPoint point)
        {
            bDrawing = TRUE;
            SetCursor(LoadCursor(NULL,IDC_SIZEALL));

            //開始位置を終了位置を初期化
            stPoint.SetPoint(0, 0);
            edPoint.SetPoint(0, 0);
            //開始位置をセット
            stPoint = point;

            CWnd::OnRButtonDown(nFlags, point);
        }

        /***********************************************************
        OnRButtonUp
        子ウィンドウでマウスの右ボタンが離されたイベント
        ***********************************************************/

        void CChildView::OnRButtonUp(UINT nFlags, CPoint point)
        {
            if (bDrawing)
            {
                SetCursor(LoadCursor(NULL,IDC_ARROW));
                //終了位置をセット
                edPoint = point;
                //四角形を描画する
                DrawRectangle();
            }
            bDrawing = FALSE;

            CWnd::OnRButtonUp(nFlags, point);
        }


        /***********************************************************
        OnMouseMove
        マウスが移動中に発生するイベント
        ***********************************************************/

        void CChildView::OnMouseMove(UINT nFlags, CPoint point)
        {
            if (bDrawing)
            {
                SetCursor(LoadCursor(NULL,IDC_SIZEALL));
            }

            //WM_MOUSELEAVEイベントを受け取れるようにしておく
            //TrackMouseEventについてはDeveloperNetwork参照
            TRACKMOUSEEVENT tme;
            tme.cbSize = sizeof(TRACKMOUSEEVENT);
            tme.dwFlags = WM_NCMOUSELEAVE;
            tme.hwndTrack = this->GetSafeHwnd();
            tme.dwHoverTime = 0; //関係ないので0をセットしておく
            TrackMouseEvent(&tme);

            CWnd::OnMouseMove(nFlags, point);
        }

         

        /***********************************************************
        OnMouseLeave
        子ウィンドウのクライアント領域をマウスが離れたイベント
        描画フラグとアイコンをリセットする
        ***********************************************************/

        void CChildView::OnMouseLeave()
        {
            bDrawing = FALSE;
            SetCursor(LoadCursor(NULL, IDC_ARROW));
            TRACE(L"OnMouseLeave¥r¥n");

            CWnd::OnMouseLeave();
        }

         

        /***********************************************************
        DrawRectangle
        開始Pointと終了Pointに対して四角形を描画する
        塗りつぶし色、線の色、線のスタイルはメニューの選択値を取得
        ***********************************************************/

        void CChildView::DrawRectangle()
        {
            CDC *pDC = this->GetDC();

            //四角形を塗りつぶすブラシ
            CBrush brs(theApp.selClr);
            CBrush *pOldBrush = pDC->SelectObject(&brs);

            //四角形を描画するペン
            //1より大きな幅を指定するとPS_SOLIDスタイルになるため幅は0とする
            CPen pen;
            pen.CreatePen(theApp.iSelStyle, 0, theApp.selLinfClr);
            CPen *pOldPen = pDC->SelectObject(&pen);

            //四角形を描画する領域
            CRect rect(stPoint,edPoint);
            //参考情報として出力ウィンドウに座標表示
            CString cs;
            cs.Format(L"st.x=%d st.y=%d ed.x=%d ed.y=%d¥r¥n", 
                stPoint.x, stPoint.y, edPoint.x, edPoint.y);
            TRACE(cs);

            //四角形を描画
            pDC->Rectangle(rect);

            //オブジェクトを戻す
            pDC->SelectObject(pOldBrush);
            pDC->SelectObject(pOldPen);
        }

         

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

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

         


        【VC++】SDIにリストコントロールを追加してイベント処理を実装する

        0

          <機能>

          (1)MFCのSDIアプリケーションにリストコントロール(CListCtrl)を追加する

          (2)リストコントロールをCreate(サイズ・WindowStyle指定)する

          (3)リストコントロールのフォントを変更してみる(MS UI Gothic使用)

          (4)ヘッダ設定(InsertColumn)、データ設定(InsertItem)を行う

          (5)イベントを追加する(WindowProc)

            ・LVN_ITEMCHANGED : リストコントロールに変更があった
            ・LVN_COLUMNCLICK : リストコントロールのヘッダが左クリックされた

           

          <実行イメージ>

          フォントをMS UI Gothicに変更しヘッダ・データをセット

          ※データは東京都の市区町村別人口

          VisualStudio,MFC,SDI,CListCtrl,実行イメージ,
           

          リスト選択により選択行番号と選択行の情報を表示

          VisualStudio,MFC,SDI,CListCtrl,LVN_ITEMCHANGED,

          項目行左クリックにより選択カラム番号を表示

          VisualStudio,MFC,SDI,CListCtrl,LVN_COLUMNCLICK,
           

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

           

          <使い方>

          1.MFCアプリケーションでプロジェクトを作成

          2.アプリケーションの種類でシングルドキュメントを選択

          VisualStudio,MFC,SDI,CListCtrl,アプリケーションの種類,
           

          3.ユーザーインターフェイス機能でくクラシックメニューを使用するを選択

          ※その他の設定は下図参照

          VisualStudio,MFC,SDI,CListCtrl,ユーザーインターフェイス機能,
           

          4.高度な機能で不要なチェックを外す

          VisualStudio,MFC,SDI,CListCtrl,高度な機能,
           

          5.プロジェクト構成を確認しソースを追加する

          VisualStudio,MFC,SDI,CListCtrl,ソリューション,プロジェクト構成,
           

          6.クラスウィザードにてCChileViewクラスにOnCreateハンドラーを追加

          ※OnCreateでリストコントロールを生成しデータを設定する

          VisualStudio,MFC,SDI,CListCtrl,クラスウィザード,OnCreate,
           

          7.クラスウィザードにてCChileViewクラスにWindowProcハンドラーを追加

          ※WindowProcでリストコントロールのイベント処理を行う

          VisualStudio,MFC,SDI,CListCtrl,クラスウィザード,WindowProc,
           

          MainFrm.cpp

          //メインフレームのサイズ設定を行う

          BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
          {
              if( !CFrameWnd::PreCreateWindow(cs) )
                  return FALSE;

              cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
                   | WS_SYSMENU;

              //cs.dwExStyle &= ~WS_EX_CLIENTEDGE;
              //ウィンドウサイズとクライアント領域を一致させる
              cs.dwExStyle = WS_EX_CLIENTEDGE;
              cs.lpszClass = AfxRegisterWndClass(0);

              //作業領域のサイズを取得
              //画面全体からシステムのタスクバーやアプリケーションのツールバーが占有する領域を除いた部分
              CRect rcSpara;
              SystemParametersInfo(SPI_GETWORKAREA, NULL, &rcSpara, NULL);
              //ウィンドウサイズの設定
              CRect rect(0, 0, 600, 400);
              ::AdjustWindowRectEx(&rect, cs.style, TRUE, cs.dwExStyle);
              //ウィンドウサイズを取得
              cs.cx = rect.Width();
              cs.cy = rect.Height();
             
              //画面中央に表示
              cs.x = rcSpara.left + (rcSpara.Width() - cs.cx) / 2;
              cs.y = rcSpara.top + (rcSpara.Height() - cs.cy) / 2;

              return TRUE;
          }

          ChildView.h

          //フォント変更するためCFontオブジェクトを追加

          class CChildView : public CWnd
          {


          //省略~~


          public:
              afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

          private:
              const int D_IDLISTVIEW = 1000;
              void InsertListCtrlItems(CListCtrl *pList);
          public:
              virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam);
              CFont *m_pFont;
          };

          ChildView.cpp

          CChildView::CChildView()
          {
              //子ウィンドにフォントをセット
              m_pFont = new CFont;
              LOGFONT logFont;
              logFont.lfHeight = 12;
              logFont.lfWidth = 10;
              logFont.lfEscapement = 0;
              logFont.lfOrientation = 0;
              logFont.lfWeight = FW_DONTCARE;
              logFont.lfItalic = FALSE;
              logFont.lfUnderline = FALSE;
              logFont.lfStrikeOut = FALSE;
              logFont.lfCharSet = DEFAULT_CHARSET;
              logFont.lfOutPrecision = OUT_DEFAULT_PRECIS;
              logFont.lfClipPrecision = CLIP_DEFAULT_PRECIS;
              logFont.lfQuality = DEFAULT_QUALITY;
              logFont.lfPitchAndFamily = FF_DONTCARE;
              lstrcpy(logFont.lfFaceName, L"MS UI Gothic");
              m_pFont->CreateFontIndirect(&logFont);
          }

          CChildView::~CChildView()
          {
              //フォントオブジェクトを破棄
              delete m_pFont;
          }

          /***********************************************************
          OnCreate
          SDIで子ウィンドウの作成時にリストコントロール(CListCtrl)を生成
          ***********************************************************/

          int CChildView::OnCreate(LPCREATESTRUCT lpCreateStruct)
          {
              if (CWnd::OnCreate(lpCreateStruct) == -1)
                  return -1;

              //ウィンドウサイズを取得
              CFrameWnd *pFrm = GetParentFrame();
              CRect rect;
              pFrm->GetClientRect(&rect);

              //リストコントロール(レポート形式)を配置
              //ウィンドウサイズに対して余白10で配置する
              CListCtrl *pListctrl = new CListCtrl();
              //List-View Window Stylesはデベロッパーセンターを参照
              pListctrl->Create(

                  WS_VISIBLE | WS_BORDER | LVS_SHOWSELALWAYS | LVS_SORTASCENDING | LVS_REPORT | LVS_SINGLESEL,
                  CRect(10, 10, rect.Width()-20, rect.Height()-20), this, D_IDLISTVIEW);
             
              //拡張スタイルを設定
              pListctrl->SetExtendedStyle(pListctrl->GetExtendedStyle() | LVS_EX_FULLROWSELECT);
             
              //リストカラムセッティング
              LV_COLUMN lvclm;
              ZeroMemory(&lvclm, sizeof(LV_COLUMN));
              lvclm.mask = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH;

              //インデックス0の列はは常にLVCFMT_LEFTとなる
              //詳細はデベロッパーセンターのRemarks参照
              //lvclm.fmt = LVCFMT_CENTER;
              lvclm.iSubItem = 0;
              lvclm.pszText = L"地域コード";
              lvclm.cx = 130;
              pListctrl->InsertColumn(0, &lvclm);

              lvclm.fmt = LVCFMT_LEFT;
              lvclm.iSubItem = 1;
              lvclm.pszText = L"市区町村名";
              lvclm.cx = 250;
              pListctrl->InsertColumn(1, &lvclm);

              lvclm.fmt = LVCFMT_RIGHT;
              lvclm.iSubItem = 2;
              lvclm.pszText = L"人口(人)";
              lvclm.cx = 150;
              pListctrl->InsertColumn(2, &lvclm);

              //アイテムセット
              InsertListCtrlItems(pListctrl);
              //フォントをセット
              GetDlgItem(D_IDLISTVIEW)->SetFont(m_pFont);

              return 0;
          }

          /***********************************************************
          InsertListCtrlItems
          リストコントロールにデータ(東京都市区町村の人口)をセット
          ***********************************************************/

          void CChildView::InsertListCtrlItems(CListCtrl *pList)
          {
              TCHAR twk[64];
              int idx=0;
              LVITEM lvitm;

              struct
              {
                  int id;
                  TCHAR name[128];
                  int population;
              }item[]={
                  { 13101,_T("東京都 千代田区"),61218 },{ 13102,_T("東京都 中央区"),156256 },
                  { 13103,_T("東京都 港区"),253018 },{ 13104,_T("東京都 新宿区"),343533 },
                  { 13105,_T("東京都 文京区"),227141 },{ 13106,_T("東京都 台東区"),202947 },
                  { 13107,_T("東京都 墨田区"),264229 },{ 13108,_T("東京都 江東区"),510574 },
                  { 13109,_T("東京都 品川区"),397710 },{ 13110,_T("東京都 目黒区"),283005 },
                  { 13111,_T("東京都 大田区"),728423 },{ 13112,_T("東京都 世田谷区"),921720 },
                  { 13113,_T("東京都 渋谷区"),229670 },{ 13114,_T("東京都 中野区"),335745 },
                  { 13115,_T("東京都 杉並区"),575841 },{ 13116,_T("東京都 豊島区"),298050 },
                  { 13117,_T("東京都 北区"),348547 },{ 13118,_T("東京都 荒川区"),216273 },
                  { 13119,_T("東京都 板橋区"),574058 },{ 13120,_T("東京都 練馬区"),731696 },
                  { 13121,_T("東京都 足立区"),677514 },{ 13122,_T("東京都 葛飾区"),450846 },
                  { 13123,_T("東京都 江戸川区"),691084 },{ 13201,_T("東京都 八王子市"),577910 },
                  { 13202,_T("東京都 立川市"),179390 },{ 13203,_T("東京都 武蔵野市"),146381 },
                  { 13204,_T("東京都 三鷹市"),190432 },{ 13205,_T("東京都 青梅市"),135789 },
                  { 13206,_T("東京都 府中市"),261829 },{ 13207,_T("東京都 昭島市"),111902 },
                  { 13208,_T("東京都 調布市"),235243 },{ 13209,_T("東京都 町田市"),434091 },
                  { 13210,_T("東京都 小金井市"),123813 },{ 13211,_T("東京都 小平市"),192874 },
                  { 13212,_T("東京都 日野市"),188327 },{ 13213,_T("東京都 東村山市"),150180 },
                  { 13214,_T("東京都 国分寺市"),124501 },{ 13215,_T("東京都 国立市"),74610 },
                  { 13218,_T("東京都 福生市"),58210 },{ 13219,_T("東京都 狛江市"),82357 },
                  { 13220,_T("東京都 東大和市"),84664 },{ 13221,_T("東京都 清瀬市"),75377 },
                  { 13222,_T("東京都 東久留米市"),116360 },{ 13223,_T("東京都 武蔵村山市"),71651 },
                  { 13224,_T("東京都 多摩市"),147691 },{ 13225,_T("東京都 稲城市"),90225 },
                  { 13227,_T("東京都 羽村市"),55225 },{ 13228,_T("東京都 あきる野市"),80373 },
                  { 13229,_T("東京都 西東京市"),202201 },{ 13303,_T("東京都 西多摩郡瑞穂町"),33102 },
                  { 13305,_T("東京都 西多摩郡日の出町"),17404 },{ 13307,_T("東京都 西多摩郡檜原村"),2096 },
                  { 13308,_T("東京都 西多摩郡奥多摩町"),5058 },{ 13361,_T("東京都 大島町"),7580 },
                  { 13362,_T("東京都 利島村"),343 },{ 13363,_T("東京都 新島村"),2630 },
                  { 13364,_T("東京都 神津島村"),1845 },{ 13381,_T("東京都 三宅島三宅村"),2383 },
                  { 13382,_T("東京都 御蔵島村"),343 },{ 13401,_T("東京都 八丈島八丈町"),7330 },
                  { 13402,_T("東京都 青ヶ島村"),174 },{ 13421,_T("東京都 小笠原村"),3067 },
                  0
              };
              for (INT i = 0;; i++)
              {
                  if (item[i].id == 0) break;
                  ZeroMemory(&lvitm, sizeof(LVITEM));
                  lvitm.mask = LVIF_TEXT;
                  lvitm.iItem = pList->GetItemCount();
                  lvitm.iSubItem = 0;
                  ZeroMemory(&twk, sizeof(twk));
                  wsprintf(twk, _T("%d"), item[i].id);
                  lvitm.pszText = twk;
                  idx = ListView_InsertItem(pList->GetSafeHwnd(), &lvitm);
                  //idx = pList->InsertItem(&lvitm);
                  if (idx == (-1))
                  {
                      AfxMessageBox(L"InsertItem Error!!",MB_ICONSTOP);
                      return;
                  }
                  ZeroMemory(&lvitm, sizeof(LVITEM));
                  lvitm.mask = LVIF_TEXT;
                  lvitm.iItem = idx;
                  lvitm.iSubItem = 1;
                  lvitm.pszText = item[i].name;
                  ListView_SetItem(pList->GetSafeHwnd(), &lvitm);
                  //pList->SetItem(&lvitm);

                  ZeroMemory(&lvitm, sizeof(LVITEM));
                  lvitm.mask = LVIF_TEXT;
                  lvitm.iItem = idx;
                  lvitm.iSubItem = 2;
                  ZeroMemory(&twk, sizeof(twk));
                  wsprintf(twk, _T("%d"), item[i].population);
                  lvitm.pszText = twk;
                  ListView_SetItem(pList->GetSafeHwnd(), &lvitm);
                  //pList->SetItem(&lvitm);
              }
          }

          /***********************************************************
          WindowProc
          リストコントロールのイベント処理
          LVN_ITEMCHANGED : リストコントロールに変更があった
          LVN_COLUMNCLICK : リストコントロールのヘッダが左クリックされた
          ***********************************************************/

          LRESULT CChildView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
          {
              LV_DISPINFO *lvdisp;
              NM_LISTVIEW *pNMLV;
              CString cs;
              int idx;

              switch (message)
              {
              case WM_NOTIFY:
                 
                  //リストコントロールからのメッセージのみ処理する
                  if ((int)wParam == D_IDLISTVIEW) {
                      lvdisp = (LV_DISPINFO *)lParam;
                      pNMLV = (NM_LISTVIEW *)lParam;
                      //リストビューを取得
                      CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(D_IDLISTVIEW);
                      //選択されている行のインデックスを取得
                      idx = pNMLV->iItem;

                      switch (lvdisp->hdr.code) {
                      case LVN_ITEMCHANGED:
                          //選択行の情報を表示する
                          if ((pNMLV->uChanged & LVIF_STATE) && (pNMLV->uNewState & LVIS_SELECTED)) {
                              cs.Format(L"%d行目¥r¥n地域コード  [%s]¥r¥n市区町村名  [%s]¥r¥n人口     [%s]",
                                  idx+1,pListCtrl->GetItemText(idx, 0),

                                  pListCtrl->GetItemText(idx, 1),

                                  pListCtrl->GetItemText(idx, 2));
                              AfxMessageBox(cs,MB_ICONINFORMATION);
                          }
                          break;
                      case LVN_COLUMNCLICK:
                          //iSubItemを参照してヘッダのクリックされた列を表示する
                          cs.Format(L"ヘッダ行の%d列目が左クリックされました", pNMLV->iSubItem+1);
                          AfxMessageBox(cs,MB_ICONINFORMATION);
                          break;
                      }
                  }
                  break;

              default:
                  ;
              }

              return CWnd::WindowProc(message, wParam, lParam);
          }

           

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

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



          | 1/6PAGES | >>