MFC

ホントにこれでいいのか疑問なコード

in

CEditBoxの幅を入力可能な文字数にあわせるとか、エディットボックス自体を右揃えにするなんてことは誰でも考えることだろうけど、皆どう実装しているんだろうか?僕は、

// Create Controll Font
m_ctrl_font.CreatePointFontIndirect(&logfont,pDC);
// Label A
tmpstr      = "LABEL A";
GetTextExtentPoint32(pDC->m_hDC,tmpstr.c_str(),tmpstr.length(),&textSize);
rect.top    = 20;
rect.left   = 20;
rect.bottom = rect.top  + (tm.tmExternalLeading + tm.tmHeight);
rect.right  = rect.left + textSize.cx;
CStatic* l = new CStatic;
l->Create(tmpstr.c_str(),SS_LEFT|WS_VISIBLE|WS_CHILD,rect,this);
l->SetFont(&m_ctrl_font);
// Edit A
int edge_w = GetSystemMetrics(SM_CXEDGE);
GetTextExtentPoint32(pDC->m_hDC,_T("1234567890"),10,&textSize);
rect.left   = rect.right + tm.tmMaxCharWidth;
edit_a_right = rect.right  = rect.left  + textSize.cx + (edge_w * 2);
CEdit* e = new CEdit;
e->CreateEx(WS_EX_STATICEDGE,_T("EDit"),"",
  ES_LEFT|WS_CHILD|WS_VISIBLE|WS_TABSTOP,rect,this,WM_USER+1);
e->SetFont(&m_ctrl_font);

みたいなコード(全ソース)を書いたりしていたのだけれどこれってかなり面倒。リソースエディタでペタペタ貼り付けて適当な大きさに並べておいてOnSize()あたりで幅を調整するのもありかと思うけどそれでも面倒な事は同じですよね?結局、コントロールの数だけ上記のようなコードをゴリゴリ書くわけです。

偽SDIスタイル

in

WindowsアプリにあるMDIというインタフェースは個人的には大嫌いなので(Accessの使いにくさっていったらない)できる限りSDIとして設計するようこころがけているのですが、いま、仕掛かり中のアプリケーションは政治的理由もあってMDIテンプレートから作成しています。まぁ、プログラマが社内の政治的問題を気にしているようではおしまいですが仕方がない。状況によっては簡単に機能要件がひっくり返ってしまうのでその場合どうしても新しいWindowを作らざるを得ず最初からこっそりMDIで作っておくが得策なんで...

まあ、それで必要があるまで偽SDIスタイルにしておくためのダミーコード。

BOOL CChildFrame::PreCreateWindow(CREATESTRUCT& cs)
{
  // TODO: CREATESTRUCT cs を変更して、Window クラスまたはスタイルを変更します。
  if( !CMDIChildWnd::PreCreateWindow(cs) )
    return FALSE;
  
  // ----------------------------------------------------
  // とりあえず必要があるまでSDIスタイルにしておく
  // ----------------------------------------------------
  cs.style &= ~(WS_MAXIMIZEBOX|WS_MINIMIZEBOX|WS_SYSMENU);
  return TRUE;
}

最初は最大小化ボタンと閉じるボタンを外せば簡単にできると思っていたのですが、子ウィンドウが最大化されている状態では、最大化ボタンは「元に戻る」のチップスがでているとおり、disableになってくれませんでした。いろいろ試してWS_SYSMENUを追加することでうまくいきました。もちろん、偽SDIスタイルですから子ウィンドウは最大化しておく必要があります。

以上、つまらないチップスメモでした。まあ、見た目ができてりゃそれでいい人たちばっかりですから...

リストコントロールのTIPSあれこれ

昨日は久しぶりにMFCでコードを書きました。データを一覧表示するのにリストコントロールのレポート機能を使ったのですが、使い方をもうすっかり忘れてしまっていてずいぶん時間をかけてしまいました。僕がやることなんて大抵いつも同じなのでテンプレート用サンプルを作成しておけば、後々あちこちのプロジェクトを引っかき回すこともないかと考え、テンプレート的サンプルプログラムを作成しました。

ようやくVisualStudio2005

in

ずっと稟議をだしていてようやく通ったVisualStudio 2005。いいぇ、2005ですとも。ここまで引っ張られたらいっそのこと2008でもヨカッタかと...早速、アプリの移行を開始したのですがいろいろあります。まず、セキュリティ強化なんたらで文句言われちゃって、警告の山。最初は律儀にセキュリティ強化版の関数XXX_s()に置き換えたんだけれど、なんか馬鹿馬鹿しくなってヤメ。

VC++(MFC)でMSCHARTを操作する方法(3)

このところずっとCocoaな毎日だったのですが久しぶり、MFCネタ。以前、VC++(MFC)でMSCHARTを操作する方法といエントリを書いたのですがチャートの線色を変えるには?というコメントを頂いたのでちょっと試してみました。チャートの色を変えるというのは初めてトライするのですが、大体のやり方は他のオブジェクトと同じなのでそれほど迷いなくいけました。用は、Chartオブジェクトを起点に必要なオブジェクトをget_xxx()でたどり、該当するオブジェクトにたどり着いたらput_xxx系でプロパティをセットしてやるというのがおおまかな手順。どのオブジェクトが必要になるかさえ調べてしまえば意外と簡単です。

VC++(MFC)で帳票印刷の手を抜く方法

in

前に書いたVC++(MFC)でExcelを操作する方法というエントリを読んでくれる方が結構いて、あぁ、Web全盛のこの時代でも僕と同じようにまだデスクトップアプリを作成せねばいけない方は多いんだなと実感します。そこで、僕が日頃もっとも面倒だと思っているVC++(MFC)からの帳票印刷について書いておきます。

VC++(MFC)でMSCHARTを操作する方法(2)

前回、グラフの初期状態まで描画したのでデータをセットします。といっても、初期値の代わりにちゃんとしたデータをセットするだけ。まず、適当なデータとアクセサをDocumentクラスに作成ます。ここでは仮に数量・金額・差額の3メンバをもつcchart_dataクラスを作成し、このクラスを格納するメンバ変数をDcoumentクラスに宣言しています。

VC++(MFC)関連の記事まとめ

in

VC++およびMFCに関する記事まとめ

この記事の一部をhippos-lab::net(別館)でまとめています。

VC++(MFC)でMSCHARTを操作する方法(1)

またまた、VCの仕事。ちょっと疲れましたよ。今度はデータを画面上でグラフ表示したいという案件。それこそ、エクセルでやればイイじゃんって思うのですが、その場でお客さんにみせたいとのこと....毎度毎度。そこで今度はVisualBasic付属のMSCHRT20.OCXを利用してFormViewにグラフを表示してみました。今回も情報が少なく手探りのコーディングで苦労しました。忘れないうちにメモを残します。

おおまかな手順はこんなカンジ。

VC++(MFC)でExcelを操作する方法(2)

前回は、セルに値を設定するところまで書いたので書式設定方法について補足します。前回書いた方法で値をセットしたエクセルを開いてみるとわかるのですが数値としてセルにセットした内容も文字列として表示されています。一度、セルを選択してダブルクリックするなどすれば数値として認識されるようですがこれは少し面白くありません。最初は、単にセルに書式を設定すればちゃんと数値扱いになるかななどとタカを括っていたのですが...

VC++(MFC)でExcelを操作する方法(1)

仕事で、久しぶりVC++をやることに。どうしても出力はExcelにして欲しいという要望があってかつての記憶を手繰りながら忘れないうちにメモ。長くなりそうなので、分割してアップします。

クラスの追加で「タイプライブラリからMFCクラスを作成」ExcelObjectライブラリを選択し、次のインタフェースをからクラスを生成します。(注意:Rangeクラスを生成しコンパイルするとVARIANT DialogBox()の箇所でエラーとなります。この部分はVARIANT CDialogBox()として対処しています。)

  • _Application
  • _Workbook
  • _Worksheet
  • Range
  • Workbooks
  • Worksheet
  • それぞれのクラスは名前のままエクセルのWorkbook(s)/Worksheet(s)/Rangeのラッパクラスとなります。また、各種関数を呼び出す際に使用するオプションパラメタは下記のように定義しています。

コンテンツの配信