winプログラムを始めて間がない初心者ですが、よろしくお願いします。

ダイアログ上に、ビットマップ画像を使ってボタンを作成するために、
MFCのCButtonのオーナー描画 や CBitmapButtonを使ってボタンコントロールを作成したところ、
ボタンの反応速度が遅く、連続でクリックが出来なくて、困っています。
反応速度の早いボタンコントロールを作成するには、どうすれば良いのでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (1件)

オーナー描画で連続クリックした場合、2回目のクリックがダブルクリックとして


判断されているために、反応速度が遅く見えていると思われます。

CButtonクラスを派生させて描画していると思いますので、そのソースに
PreTranslateMessageをオーバーライドし、ダブルクリックのメッセージを
クリックとして処理させれば連続クリックも早く反応すると思います。
BOOL CButtonBase::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message == WM_LBUTTONDBLCLK){
SendMessage(WM_LBUTTONDOWN, pMsg->wParam, pMsg->lParam);
return TRUE;
}

return CButton::PreTranslateMessage(pMsg);
}
    • good
    • 0
この回答へのお礼

感激です(^^;
dannerさんの回答で、問題解決できました。
本当にありがとうございました。

お礼日時:2001/10/21 12:12

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

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

QADSLモデム(SV2)のビットマップ取得方法を教えてください。

NTT西日本のADSLモデムSV2のビットマップ取得方法を教えてください。よろしくお願いいたします。

Aベストアンサー

http://192.168.1.1/cgi-bin/debugcmd.cgi?cmd=tone

でデバッグモードにアクセスしてみて下さい。

Qダイアログのボタンが押された時に、その「ボタン」のあるダイアログと、すでに表示されている他のダイアログを消したいです

Win2000/MFC/ダイアログベース
で作業しています。初心者です(^^;)

Aというダイアログで「あるボタンa」を押してDoModalでBというダイアログを表示させ、Bダイアログで「あるボタンb」を押してDoModalでCというダイアログを表示させ、Cダイアログで「あるボタンc」を押した時にBダイアログとCダイアログを閉じたい(消したい)のですが
EndDialogで消せません
DoModalの戻り値をret_b,ret_cとした場合
EndDialog(ret_c);
EndDialog(ret_b);
としたのですが。。。

やり方がおかしいのか、よくわかりません・・
初心者でもわかりやすいお返事お待ちしています(^^;)

Aベストアンサー

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値が先の CDlgB::DoModal() の戻り値となります。
戻り値がある特定の値だったとき、つまり、質問の例ではダイアログボックス B で EndDialog(ret_b) が実行されたことが特定できたときに CDlgA も EndDialog() を実行すれば連鎖してダイアログボックスを閉じることができます。
ダイアログボックス C についても同様です。

実際のコーディングでは次のようになると思います。
ただし、ダイアログボックス A もモードレスで表示されていると仮定しています。



#define ret_b (-1) // 特定の値
#define ret_c (-1) // ID_OK や ID_CANCEL と重ならないように注意

...

(CDlgA の実装)

void CDlgA::OnButtonA() // あるボタン a が押されたときの処理
{
CDlgB dlg; // ダイアログボックス B

if (dlg.DoModal() == ret_b) // モードレスで表示して、戻り値をチェック
EndDialog(-1); // ダイアログボックス A を閉じる
}

...

(CDlgB の実装)

void CDlgB::OnButtonB() // あるボタン b が押されたときの処理
{
CDlgC dlg; // ダイアログボックス C

if (dlg.DoModal() == ret_c) // モードレスで表示して、戻り値をチェック
EndDialog(ret_b); // ダイアログボックス B を閉じる
}

...

(CDlgC の実装)

void CDlgC::OnButtonC() // あるボタン c が押されたときの処理
{
EndDialog(ret_c); // ダイアログボックス C を閉じる
}

各ダイアログボックスを CDialog の派生クラスとして次のように定義したとします。

CDlgA --- A というダイアログボックス
CDlgB --- B というダイアログボックス
CDlgC --- C というダイアログボックス

CDlgA のあるメンバ関数から CDlgB::DoModal() でダイアログボックス B を表示させます。 CDlgB のあるメンバ関数で EndDialog() を実行すればダイアログボックス B を閉じることができます。ここで、 CDialog::EndDialog() は引数として INT 型の値をひとつ渡すことができますが、その値...続きを読む

Q「PrtScキーで ビットマップデータをクリップボードに取得して」?

あるページで,数式がとても綺麗に書かれていたので,どうやっているんだろうと思って見てみたら,そのページに,
「TeXファイルから platex でコンパイルし, dviout で dvi ファイルを作ります.それを表示した状態で PrtScキーで ビットマップデータをクリップボードに取得して,画像形式変換ソフトに取り込んで gif を作る.」
と書いてありました。dviファイルを表示した状態で,までは分かるんですが,その後がさっぱりです。「PrtScキーで ビットマップデータをクリップボードに取得して」ってどういうことですか?また,「PrtScキー」ってMacにもあるんですか?
ちなみに,以下のページです。
http://www.interq.or.jp/student/suugaku/index.html

Aベストアンサー

まずは用語解説から。

PrtScキー --- Windowsで使用する画面取り込み用キー
クリップボード --- コピーやペースト時に使用する特殊なメモリ領域

というわけで、「PrtScキーで ビットマップデータをクリップボードに取得して,画像形式変換ソフトに取り込んで gif を作る.」 というのは、「PrtScキーで表示中の画面をビットマップ形式の画像としてクリップボードに取り込み、画像形式変換ソフトで貼り付けてからgif形式で保存する」ということを意味しています。

Macで同様の事をするのであれば、COMMANDキー+shift+3(もしくは類似のショートカット)で画面の取り込みを行ってください。起動ドライブにPICTファイルが作成されるので、適当なソフトでGIFに変換してください。

Q[VC++][MFC][SDI]ダイアログコントロールもしくわツールバー!!詰まってます!!

現在VC++6.0でMFCを使いSDIのプログラムを作っているのですが、フォームにダイアログバーを張っています。

これをツールバーのように自由に動かしたり、左右上下にドッキングさせたり。
これって実現可能でしょうか?

色々ためしてみたんですが無理でした。
やっぱ不可能ですかね?

これが無理なんであればデフォルトで作成されるツールバー([新規作成][開く][保存]等が入ってる)にコントロール(ボタンやリストボックス)を追加して使用、と考えているのですがこれも難しい!!!


まだまだ未熟者なのですがどうかご存知の方おられましたらご教授ください!!
よろしくお願いします!!

Aベストアンサー

Dannerです。
参考URL(英語)を載せておきます。

参考URL:http://www.codeguru.com/Cpp/controls/toolbar/placingcontrolsintoolbars/article.php/c2505/

Qツールバーのビットマップの変更

WinXP,SDKです。
たとえば、XP上で見たエクスプローラやIEのツールバーのボタンには、押した時に「押されている」状態になるものがあると思います。
IEのお気に入りのボタンなど。
押した時にこのボタンの背景が白に変化しています。(色は環境によって違うかも?)
このような事を実現するにはどうすれば良いのでしょうか。

今、レバーコントロールにツールバーを置いています。
これらのボタンはすべて「TBSTYLE_CHECK」を指定してボタンのように使用しています。
このままだと、押しているものと押されていないものがぱっと見よく分かりません。
もちろん、押してあるものは背景の色も多少変わるし分からない訳ではないのですがもっと鮮明に分かるようにしたいのです。
そこで押してあるボタンのビットマップを変えたいと考えました。
ツールバーではこのような事は出来ないのでしょうか。

Aベストアンサー

IMAGELIST押されたときのイメージリストを作成して
ToolBarに対して TB_SETHOTIMAGELISTで押されたときのイメージを追加しましょう

ただ、この方法ですとボタンの上でホバー(カーソルを留めた)した際にもこの追加のイメージが使われます

Qダイアログを継承したダイアログの作成について

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つのダイアログにコントロールの貼り付けや、処理を記入せずに、その共通のコントロールをもった基底ダイアログを作成して、その基底ダイアログの継承としてダイアログが作れたらなと思い、質問させて頂きました。
継承をすると、基底クラスの関数等を使うことができるというのはわかるのですが、ダイアログ上のコントロールの位置までは不可能なのかなと疑問に思いました。
ご回答を宜しくお願い致します。

開発環境は
Windows CE 6.0
Visual Studio 2005
です。

お世話になります。
今回お聞きしたいことは、
オリジナルに作成したダイアログを継承したオリジナルのダイアログを作成した際に、オリジナルに作成した基底ダイアログのダイアログ上のコントロールや、そのコントロールの位置を継承することはできますでしょうか?
ということです。
何がしたいかといいますと、4つのダイアログをメインダイアログから呼び出すのですが、その4つのダイアログには共通するコントロールがあり、そのコントロールの動作もその位置も全く同じなのです。
そのため、いちいち4つの...続きを読む

Aベストアンサー

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
  多少困難です
  いくつかアプローチが考えられます。
  a) ダイアログ・テンプレートを個別に持つ方法
    リソース内のダイアログ・テンプレートは(共通のコントロールも含め)
    コピー&ペーストなどで独自に作成します(4つ作ります)
それぞれを制御するクラスですが、
    ウィザードのサポートを受けられない
    (ウィザードではCDialog派生にされてしまう)
    ので、既存のCDialog派生クラスを参照して
    自力で希望のCDialog派生からさらに派生させるようにします

    リソースIDとクラスの結びつけ方法などは既存のクラスを
    参考にしてください

  b)リソースも完全に共通化する
    ちょっと難しいかもしれません。
    OnInitDialog等で自力でコントロールをCreateします。
    レイアウトが視覚的にできないので非常に困難ですが、
    隣接するコントロールの位置情報をもとに計算するなどしてください。

    ダイアログの大きさに余裕があり、
    追加するコントロールも小さなもの
    (1行のみのエディット等)であれば、
    最初から場所をstaticコントロールで場所を確保しておき
    非表示にしておいて、
    派生クラスで、そのstaticの位置を取得するとかなり楽ができます。

    派生クラスで、本格的にレイアウトが変わってしまう場合は、
    レイアウトを頭に入れながら、Createし、試行錯誤で
    完成させることになるでしょう。


以上の方法がCEでも通じるのかわかりませんが、
参考になれば幸いです。    

   

私、CEの経験がないので厳密なところはわからないのですが、
一般的なMFCであれば、可能です。
ただし、条件により困難さが変わります

1)4つのダイアログが全て同じコントロールのみからなる場合
  コントロールは同じだが、ラベルのキャプションが違うとか
  リストボックスのデータが違うとかいう場合です。

  非常に単純です。普通の派生と全く同じ感じです
  OnInitDialog等適当な関数をオーバーライドするだけです。

2)共通のコントロール以外に独自のコントロールも持つ場合
 ...続きを読む

Qビットマップ画像の座標を小数で扱う方法について。

ビットマップ画像の座標を小数で扱う方法について。


プログラムでビットマップ画像を扱っています。
現在、ビットマップ画像のRGBの値を2次元配列に格納しています。
そのため、例えば画像の白い部分の座標がどこかを知りたいときは、2次元配列の場所を辿り、整数値として座標を得ています。
これを整数値ではなく、少数値で扱うことは可能でしょうか?
配列で扱う以外に方法が思いつかないです;;
よろしくお願いします。

Aベストアンサー

何をしたいか、によります

・白い点を探すのなら、画素単位になるので、小数座標はありえません。
・白い領域を探すのなら、一つ一つの点の座標は整数ですが、中心や重心等の計算結果は小数座標になり得ます。
・ビットマップに書き込むには整数の座標しかできません。
サブピクセル単位で書き込みたいのなら、画像を拡大して書いたら縮小するとか、理想の白黒比を計算するとかです。
・ビットマップから値を読み込むのも整数座標ですが、小数座標に該当する値を周辺の画素から近似する、という方法があります。
ニアレストレイバー、バイリニア、バイキュービック等で検索してみてください。

Qダイアログにあるボタンを指定した順番どおりに、キーボードの矢印ボタンやタブボタンで移動したい

お世話になります。

C++6.0 MFCで開発しております。

現在、ダイアログの上に(1)~(5)のボタンがあるのですが、
キーボードの矢印ボタンやタブボタンで移動すると
(2)→(1)→(5)→(4)→(3)
のように、意図しない順番でボタンがアクティブになってしまいます。
それをきちんと
(1)→(2)→(3)→(4)→(5)
と順番どおりに移動するようにしたいのですが、どのようにすれば
いいのでしょうか?

お手数ですが何卒よろしくお願いします。

Aベストアンサー

VC6の場合 ダイアログエディタを起動して
Ctrl+Dまたはメニューから レイアウト > タブオーダーを実行します

コントロールの左肩に現在のタブ順が表示されるので
1番から順に指定したいコントロールをクリックしてみましょう
その後実行ファイルの更新(ビルドまたはリビルド)実行すれば
希望通りのタブ順になっているはずですよ ・・・

Qビットマップイメージの変更方法

「ビットマップイメージ ビットの深さ」
「ビットマップイメージ 編集」
などのキーワードで検索してみたのですが、何かソフトをDLして
それでどうこうというのしかなかったのですが
あまりそういった物は入れたくないので質問させてください。

当方、ラグナロクオンラインというネットゲームをしています。
その中でエンブレム(画像)を設定する事ができるのですが
所持している画像が32bitでしてゲーム内に反映できません。
ラグナロクオンライン公式サイトによると

画像サイズ  24(縦)×24(横)ピクセル
画像フォーマット  ビットマップ(24bit)
透過色(16進数/RGB)  #FF00FF / 255 0 255

の画像ならゲーム内に反映できるらしいのですが
所持してる画像を24bitに変更する方法ありましたら
教えてください。

Aベストアンサー

No.3、4です。
内容の理解が違っていました。
たとえば「ペイント」で保存する時に色数を 24ビット ビットマップ
で保存してください。
保存画像のプロパティで詳細タブで確認してください。

幅      24 X 24
高さ     24 X 24
ビットの深さ 24

になればOKです。

Q(MFC)別々のプロジェクト内で作成したダイアログを表示させる方法

VC++2005のMFCにてアプリケーションを作成しています。

一つのソリューション内に二つのプロジェクトA、Bが存在し、
プロジェクトAで発生したあるイベント(例:ボタン押下)にて、
プロジェクトBで作成したダイアログを表示させたいのですが、
実装したところ、下記コンパイルエラーが出てしまいます。
「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」

現在のプロジェクトの設定としては、
・プロジェクトAの依存先をプロジェクトBに設定
・プロジェクトA選択状態で、
 「プロジェクト」→「プロパティ」→「構成プロパティ」
 →「C/C++全般」→「追加のインクルードディレクトリ」にて、プロジェクトBのパスを指定

と設定しているのですが、どこに問題があるのでしょうか?
もし問題があるようでしたら、正しい設定方法、また実装方法について、
お手数おかけしますが、ご教授お願いできませんでしょうか?

また下記にソースコード実装例を記載します。

【プロジェクトA(呼び出し側)】
#include "test2Dlg.h"//プロジェクトBのヘッダファイル
・・・
void Ctest1Dlg::OnBnClickedOk()
{
CDlgTest MyDlg;
MyDlg.DoModal();//プロジェクトBのダイアログ生成
}

【プロジェクトB(呼出され側)】
・リソースビューにて、ダイアログ(IDD_TEST2_DIALOG)の「クラスの追加」で、
 クラス名「CDlgTest」と指定

VC++2005のMFCにてアプリケーションを作成しています。

一つのソリューション内に二つのプロジェクトA、Bが存在し、
プロジェクトAで発生したあるイベント(例:ボタン押下)にて、
プロジェクトBで作成したダイアログを表示させたいのですが、
実装したところ、下記コンパイルエラーが出てしまいます。
「error C2065: 'IDD_TEST2_DIALOG' : 定義されていない識別子です。」

現在のプロジェクトの設定としては、
・プロジェクトAの依存先をプロジェクトBに設定
・プロジェクトA選択状態で、
...続きを読む

Aベストアンサー

その構成には無理があると思います

別EXEのダイアログを表示したいってことですよね

プロジェクトBの中のResource.h で定義された IDD_TEST2_DIALOGが
プロジェクトAの中のどこかで定義されていない限り質問のようなエラーになるでしょう

この問題が解決できたにせよ
今度はプロジェクトBのダイアログ用のリソースが プロジェクトAには
存在しません
したがって CDlgTestのインスタンス MyDlgを初期化しようとした時点で実行時エラーになるでしょう

リソースビューでプロジェクトBのダイアログを選択 編集 > コピー
プロジェクトAを選択 編集 > 貼り付け
でリソースをコピーします

プロジェクトBの CDlgTestクラスのソース および ヘッダーをプロジェクト Aにコピー
として 構築されることをお勧めします

別の方法としては プロジェクトBをDLLとして構築する方法がありますが
ここですべてを説明できるものではありません


人気Q&Aランキング

おすすめ情報