MFCのエクスプローラスタイルでスケルトンを生成し、エクスプローラのように
パソコン内のディレクトリやファイルを閲覧するものを作っています。

左のペインのツリー表示から始め、なんとか全ディレクトリ(仮想フォルダは除く)を表示したのですが、
すべての処理をOnInitialUpdate()内に書いてしまったので、
実行すると最初から、すべて展開した状態になってしまいます。

実際は、マイコンピュ-タと、その下のドライブくらいまで表示して、
あとはプラスマークをクリック or ダブルクリックにより展開させたいのです。

OnItemexpandingあたりを使うのかな?と思うのですが、
どの記述を移せばいいのか、また引数に何を入れたら良いか、
ヘルプや本を見てもいまいちわかりません。
特にOnItemexpandingを使う必要はないのですが、
縮小させる方法がありましたら教えてください。

A 回答 (1件)

CTreeCtrlのInsertItem()を使ってれば普通に閉じた状態でアイテムが追加されるはずですけどね(^_^;


OnItemexpanding()はユーザあるいはプログラムがツリーアイテムの展開/縮小を行った時に呼ばれるハンドラなので関係ありません。

プログラム側でツリーアイテムの展開/縮小を行うにはCTreeCtrl::Expand()を使います。
(CTreeCtrl::Expand()の詳細はURLを参照してください)
第一引数は操作するツリーアイテムのハンドル
第二引数は操作内容
 閉じる場合:TVE_COLLAPSE
 開く場合:TVE_EXPAND
なので、アイテムを閉じたい場合には
Expand(ツリーアイテムのハンドル, TVE_COLLAPSE);
とします。

以下に簡単な例を。

HTREEITEM hTree;
CTreeCtrl& tree = GetTreeCtrl();

hTree = tree.InsertItem("ルート", TVI_ROOT, TVI_LAST );
tree.InsertItem("子アイテム", hTree, TVI_LAST );
tree.Expand(hTree, TVE_COLLAPSE);

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

申し訳ありません、締め切ったときにお礼を一緒に書き込んだはずなのですが
うまく入らなかったようでした。お礼が遅れてすみませんでした。
大変解かりづらい説明に対し、お答えいただきましてありがとうございました。
なかなかやってみる時間がとれていないのですが、こういう関数があったのを
知らなかったので、大変助かります。
CTreeCtrl::Expand()でなんとかなりそうです。
どうもありがとうございました。
またよろしくお願いします。

お礼日時:2001/07/29 22:13

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QMFCアプリケーションのスケルトンのビルドでいきなりエラー

Visual Studio2008のVC++でMFCアプリケーションを作る為
プロジェクトのスケルトンを作った段階で(コーディングは
一切してない)ビルドしたらいきなりエラーが出て困っています。

エラー内容:error PRJ003 cmd.exeの起動中にエラーが発生しました。

Aベストアンサー

Win32SDKなどのプロジェクトは構築できますか?

ツール > オプション > プロジェクトおよびソリューション
実行ファイルの パス設定などを見直してみましょう

QMFCで画像を表示させているのですが、透過表示する方法がわかりません。

VC2005のMFCで画像を表示させているのですが、透過表示する方法がわかりません。

OnDraw(CDC* pDC)

で、#include <atlimage.h>として、

CImage img;
img.Load( "test.gif" );
CDC* pDCImg = CDC::FromHandle( img.GetDC() );
pDC->BitBlt( 60, 10, img.GetWidth(), img.GetHeight(), pDCImg, 0, 0, SRCCOPY );
img.ReleaseDC();


すればGIF画像が表示されましたが、このGIG画像は透過GIFですが
そのまま表示されているので、背景が黒の場合透、明部分の白が見えて
四角い枠の画像となります。

GIF透過ファイルの場合、そのまま透過になる方法や、何か手段を用いて透過をさせたいです。

Aベストアンサー

ごめんなさい GetColorTableなどは使えないようです
当方で実験したところ gifを読み込んだ時点の CImageクラス内部での表現が現在のWindowsシステムの設定に依存するようです
256色パレットモードではなく 32ビットのBMPとして取り込まれていました

したがって CDCのTrabsparentBltで行ったほうが良いでしょう
int w = img.GetWidth();
int h = img.GetHeight();
COLORREF col = img.GetPixel( 0, 0 );
pDC->TransparentBlt( 0, 0, w, h, pDCImg, 0, 0, w, h, col );

またパレットが取得できる場合の検索方法ですが
COLORREF col = img.GetPixel( 0, 0 );
RGBQUAD pal[256];
img.GetColorTable( 0, 256, pal );
int nIndex = -1;
for n = 0; n < 256; n++ ) {
  if ( ( pal[n].rgbRed == ( col & 0xFF ) ) &&
     ( pal[n].rgbGreen == ( ( col & 0xFF00 ) >> 8 ) ) &&
     ( pal[n].rgbBlue == ( ( col & 0xFF0000 ) >> 16 ) ) ) {
    nIndex = n;
    break;
  }
}
img.SetTransparentColor( nIndex );
といった具合でしょう ...
# 思いつきで投稿するとこういったポカをやります m(__)m

ごめんなさい GetColorTableなどは使えないようです
当方で実験したところ gifを読み込んだ時点の CImageクラス内部での表現が現在のWindowsシステムの設定に依存するようです
256色パレットモードではなく 32ビットのBMPとして取り込まれていました

したがって CDCのTrabsparentBltで行ったほうが良いでしょう
int w = img.GetWidth();
int h = img.GetHeight();
COLORREF col = img.GetPixel( 0, 0 );
pDC->TransparentBlt( 0, 0, w, h, pDCImg, 0, 0, w, h, col );

またパレットが取得できる場合の...続きを読む

QMFCのexeのプログラムを MFCのdllに書き換えたい

VC++6.0を使用しています

新規作成
MFC AppWizard(exe)
新規
OK
[ステップ1]
ダイアログベース
次へ
[ステップ2/4]
次へ
[ステップ3/4]
次へ
[ステップ4/4]
終了

で作られた、雛型のexeをそっくりMFCのDLLに書き換えたい
と考えています
exeで作られたアプリを他のユーザーがVB6.0からDLLとして呼び出したいので書き換えて欲しいと頼まれました

MFCのDLLも雛型は簡単に出来上がるのですが
以下の関数を独立したオブジェクトにして、VB6.0からDLLの関数VBFUNC1として呼び出したいのですが、VBから呼び出すと

AfxEnableControlContainer();でアサートで引っ掛かってしまいます

ダイアログを使用したMFCのEXEをDLLとして使う場合の、コーディングについてご指南ください

BOOL CAaaApp::VBFUNC1()
//BOOL CAaaApp::InitInstance()
{
  AfxEnableControlContainer();

#ifdef _AFXDLL
  Enable3dControls();
#else
  Enable3dControlsStatic();
#endif

  CAaaDlg dlg;
  m_pMainWnd = &dlg;
  int nResponse = dlg.DoModal();
  if (nResponse == IDOK)
  {
  }
  else if (nResponse == IDCANCEL)
  {
  }
  return FALSE;
}

VC++6.0を使用しています

新規作成
MFC AppWizard(exe)
新規
OK
[ステップ1]
ダイアログベース
次へ
[ステップ2/4]
次へ
[ステップ3/4]
次へ
[ステップ4/4]
終了

で作られた、雛型のexeをそっくりMFCのDLLに書き換えたい
と考えています
exeで作られたアプリを他のユーザーがVB6.0からDLLとして呼び出したいので書き換えて欲しいと頼まれました

MFCのDLLも雛型は簡単に出来上がるのですが
以下の関数を独立したオブジェクトにして、VB6.0からDLLの...続きを読む

Aベストアンサー

まず、DLLとEXEの違いについてわかっていますか?
DLLとは"他のEXEやDLLに対して機能を提供するもの"です。

単体では役に立たず、直接・間接にEXEから呼ばれて役に立つものです。

DLLを作成するには、DLLの役割を明確にしなければなりません。
通常、関数の形で提供することが多いですが、
クライアントがC++であれば、C++クラスを提供することも可能です。

この提供することを"エクスポート"と呼びます。
エクスポートするためには特別な指定が必要です。

詳細はこちらで参考になります
http://hp.vector.co.jp/authors/VA023539/tips/dll/001.htm

なお、VB6がクライアントの場合、DEFファイルも必要です。
http://www.geocities.jp/i_love_balard/myhome/vbdll.html

さらに, DLL側でメッセージ処理を行わせるには
いくつかの注意点があります。
http://msdn.microsoft.com/ja-jp/library/30c674tx.aspx

色々大変です。

ただ単にVBからVC++のアプリを呼び出したいなら
わざわざDLLにするよりも
Shell関数のほうが簡単だと思います。

http://hanatyan.sakura.ne.jp/vbhlp/tap_shell.htm

まず、DLLとEXEの違いについてわかっていますか?
DLLとは"他のEXEやDLLに対して機能を提供するもの"です。

単体では役に立たず、直接・間接にEXEから呼ばれて役に立つものです。

DLLを作成するには、DLLの役割を明確にしなければなりません。
通常、関数の形で提供することが多いですが、
クライアントがC++であれば、C++クラスを提供することも可能です。

この提供することを"エクスポート"と呼びます。
エクスポートするためには特別な指定が必要です。

詳細はこちらで参考になります
http://...続きを読む

Q「MFCを使用しない」から「MFCのスタティックライブラリを使用」

VC++初心者ですが、

Win32Applicationで「MFCを使用しない」で作成したプログラムが正常動作しました。 そこで
「MFCを使用しない」から「MFCのスタティックライブラリを使用」にしてビルドしたところ、リンク中に
どんどんエラーがでます。 関数関係のエラーなのですが。

(1) どうすればエラーを無くせるのでしょうか
(2) 「MFCのスタティックライブラリを使用」にするとどの様なメリットがあるのか(説明している参考URLなど)。

教えて下さい

Aベストアンサー

>(1) どうすればエラーを無くせるのでしょうか

プロジェクトを作り直すのが手っ取り早いです。ソースを修正したり、プロジェクトのリンク対処のライブラリを変更したりすれば何とかできることはできますがおすすめしません。

作り直したプロジェクトに、自分が追加ソースをコピペしていけばちゃんと動くと思います。(ウィザードが自動で追加した分も含む)

>(2) 「MFCのスタティックライブラリを使用」にするとどの様なメリットがあるのか(説明している参考URLなど)。

簡単に書くと、

メリット
・使用しない
実行ファイルサイズが小さくなる。

・使用する
実行するときにMFCのランタイムDLLが不要になる。


デメリット
・使用しない
MFCのDLLに依存するので、DLLのバージョンの違いで動作に不具合が出る可能性がある。

・使用する
実行ファイルのサイズが馬鹿でかくなる。

Q関数の引数と実引数の取り扱いについて

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算させているわけですが,mainプログラムで変数x,yを定義しておいて,以下のようなプログラムにするのはありでしょうか? 参考書などをみると,前者のように取り扱っているようなのですが,試しに後者で実行させてみても同じ結果となりました.

#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

C言語初心者です.
関数の引数と実引数の取り扱いについて,教えていただきたいことがあります.
例えば,2変数の和を求める関数を考えると,以下のようになると思います.
#include <stdio.h>
double sum(double x, double y);

int main(void)
{
double a, b, wa;
a=2.0;
b=3.0;
wa=sum(a,b);
return 0;
}

double sum(double x, double y)
{
double total;
total=x+y;
return total;
}

このとき,mainプログラムでは,a,bふたつの変数を定義しておいて,関数sumに入れて計算さ...続きを読む

Aベストアンサー

> 以下のようなプログラムにするのはありでしょうか

どちらも全く同じです。
前者は、sum関数呼び出し時の実引数a,bが、それぞれsum関数の仮引数x,yに正しく対応しています。
前者は、sum関数呼び出し時の実引数x,yが、それぞれsum関数の仮引数x,yに正しく対応しています。

ところで、せっかく和の値を求めたのですから、出力する方がよいと思いませんか?


人気Q&Aランキング

おすすめ情報