CBitmapButtonを継承してマウスオーバー時に画像を変化させるようにする。

Posted on Sun 30 August 2009 in Windows

デフォルトのCBitmapButtonだとマウスオーバー時の画像を読み込んで
表示させてくれないので、CBitmapButtonを継承して機能を付け足しました。

Create()で作成して、LoadBitmapsで画像を読み込みます。
その他のAutoLoadなどには対応していません。

ヘッダー

#pragma once
class CHoverBitmapButton :
public CBitmapButton
{
  public:
    CHoverBitmapButton() : m_isHover(false) {};
    ~CHoverBitmapButton(){};
    BOOL LoadBitmaps(
      UINT nIDBitmapResource,
      UINT nIDBitmapResourceHov,
      UINT nIDBitmapResourceSel=0,
      UINT nIDBitmapResourceFocus=0,
      UINT nIDBitmapResourceDisabled=0);
    void DrawItem(LPDRAWITEMSTRUCT lpDis);
  protected:
    afx_msg void OnMouseMove(UINT nFlags, CPoint point);
    LRESULT OnMouseHover(WPARAM wp …

Continue reading

TreeViewコントロール 選択されたアイテムの文字列を取得するには

Posted on Fri 28 August 2009 in Windows • Tagged with Windows

まず、親ウィンドウでWM_NOTIFYを捕まえる。
WM_NOTIFYでTreeViewのイベントが送られてくるのでこれを処理する。
このときLPARAMにはNMTREEVIEW構造体のアドレスが入っている。

 LPNMTREEVIEW lpnmtview = (LPNMTREEVIEW)lp;
if(lpnmtview->hdr.idFrom != IDC_CONFIG_TREE) return;
switch(lpnmtview->hdr.code){
  case NM_CLICK: //ツリーアイテムクリック時
    break;
  case TVN_SELCHANGED: //ツリーアイテム選択変更時
    break;
}

このように
lpnmtview->hdr.idFromにツリービューのIDが、
lpnmtview->hdr.codeのイベントのIDが入っている。

クリックイベント時にはまだ、アイテムは選択されていないので、
NM_CLICKを捕まえて、選択アイテムを取得するというやり方では上手くいかない。

なので、TVN_SELCHANGED時に、選択アイテムを取得するという方法で行います。
このとき、送られてくる、NMTREEVIEW構造体に選択されているTVITEMが入ってるが、
このTVITEMのラベル名は正しく格納されていないので自分で取得する必要がある。

コード例は以下のようになる。

 LPNMTREEVIEW lpnmtview = (LPNMTREEVIEW)lp;
if …

Continue reading

ファイルを開くダイアログを開いたときは、カレントディレクトリが変わってる

Posted on Thu 15 January 2009 in Windows

題名の通りです。

GetOpenFileNameなどでダイアログを開くとカレントディレクトリが変わってしまうようです。

相対パスで指定したファイルが開けない場合があったので調べてみると、上の通りでした。
何時間無駄にしたことやら・・・


自動的にメニュー項目が非活性(グレーアウト)されるのを防ぎたい時は

Posted on Wed 07 January 2009 in Windows

自動的にメニュー項目が非活性(グレーアウト)されるのを防ぎたい時は
CWnd::m_bAutoMenuEnable = FALSE;
を行っておく。

MSDN:
http://msdn.microsoft.com/ja-jp/library/dz33x6wb(VS.71).aspx


CViewのアクティブイベント

Posted on Tue 23 December 2008 in Windows

CViewのアクティブイベントは、CView::OnActivateView()で拾える。

OnActivate()とかOnMDIActivate()とかOnNcActivate()だとだめだった。
調べてみたが結局OnActivateView()が正解みたいだ。


CMultiDocTemplateの子ウィンドウのメニュー変更

Posted on Mon 22 December 2008 in Windows

CDocument::GetDefaultMenu()をオーバーライドし、
自分で作成したHMENUを返せばよい。


DLLにおけるSTLの利用

Posted on Fri 28 November 2008 in Windows

http://d.hatena.ne.jp/hiroki0/20081109/1226244221
↑のヒープのエラーがでる問題だが、DLLとEXE間でSTLvectorのやり取りをしてたのが原因らしい。

STLは、inline展開されるので、DLL側とEXE側と2つバイナリコードが生成され、
これが実行時に食い違うと判定されて、ヒープのエラーが出ていたようだ。

STL DLL でググるとたくさんページが出てきた。

参考リンク
http://support.microsoft.com/kb/172396/ja
http://lamoo.s53.xrea.com/develop/tips/dlltips.html


インポートライブラリが出力されない

Posted on Sat 22 November 2008 in Windows

__declspec(dllexport) をひとつもつけないでdllをコンパイルすると
インポートライブラリ(*.lib)を吐かない。


C++クラスのDLL化

Posted on Wed 10 September 2008 in Windows

C++のクラスのDLL化の参考リンク
http://msdn.microsoft.com/ja-jp/library/a90k134d(VS.80).aspx
http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=1582533&SiteID=7

http://www2s.biglobe.ne.jp/~ragnarok/program/win32/class_of_cpp_in_dll.htm
↑は、DLLとEXE側で、クラスのサイズが違ってたりすることがあるので、
DLL側でメモリの確保、開放をしたほうがいいよということらしい。


プリコンパイル済みヘッダー

Posted on Mon 08 September 2008 in Windows

コンパイル時間の短縮のためにプリコンパイル済みヘッダーを導入したが、

c80.pdbは、このプリコンパイル済みヘッダーが作成されたときに使用されたpdbファイルではありません。プリコンパイル済みヘッダーを再作成してください。

の様なエラーが出た。

これは、後から、StdAfx.cppを追加すると、デフォルトで「プリコンパイル済ヘッダの使用」になっているので起こるようだ。
ソリューションエクスプローラからStdAfx.cppを右クリック→プロパティーで「プリコンパイル済ヘッダの作成」に変更する。

StdAfx.cppのみ、「プリコンパイル済ヘッダの作成」にすることで上手くいく様だ。