お世話になります。
今回お聞きしたいことは
MFCでダイアログ上にリストコントロールとスクロールバー、またはピクチャーコントロールとスクロールバーを設置した際に、スクロールバーの移動に伴って、リストコントロール内の列や、ピクチャーコントロールに表示されている画像の見えている箇所を移動させることが出来るかどうか。
です。
まだ、本格的にプログラムを作り始めてるわけではないのですが、事前にこのような動作が実現可能かどうかお聞きしたく、質問させて頂きました。
もしご存知の方がいましたら、参考になるHPや方法を教えていただければと思っています。参考になるHPがなくても、実現可能かどうかだけ教えて下さるだけでも結構ですので、宜しくお願い致します。

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

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

A 回答 (2件)

>仮想リストを使用する場合に特に普通のリストと、


>プログラムを作成する点で違う箇所はありますでしょうか?
プログラム的には大きく違います。オーナードローを使用するため、
使用するイメージ、項目等の領域は自分で保持、管理しなければ
なりません。
しかし、描画の高速化、メモリ節約が出来るという点は、
大きなメリットです。

>リストコントロールだと自動でスクロールバーを表示してくれる
>みたいなのですが、現在開発している機器がタッチパネル式のため、
>自動で表示されるスクロールバーではタッチするには小さいため、
>出来れば別で大きい垂直スクロールバーを設置して動かしたいと
>思っています。
>そのようにする場合にはDlgにOnVScroll()のイベントを作成して、
>その関数内でリスト内の項目を移動させるように処理すればよい
>のでしょうか?
そういった実装を行ったことが無いので、なんともいえないので、私の予想ですが、
clistctrlのスクロールバーをfalseにするということですよね。
そうすると、スクロールエリアがないということになると思うので、
そもそも移動が出来ないと思います。
スクロールバーをtrueにして、その上に強制的に独立した
スクロールバーを配置するなら別だと思いますが。。。
普通はそんなことはしないですよね。

もしかしたら、clistctrlクラスをオーバーラップし、そこで
GetScrollBarCtrlを利用しスクロールバーのポインタを取得して、
そのポインタ経由で、スクロールバーの大きさを変更するといった
ことは、出来るかもしれません。

すべては、予想ですが。。。
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。
仮想リストのメモリの節約というのは限られたメモリの組み込み機器にはかなり大きなメリットですね!!
早速調べて使ってみたいと思います。

リストのスクロールバーについては、もう少し調べてみます。
リストの標準のスクロールバーを表示させて、他に上下移動用のボタンを配置させ、そのボタンをタッチさせスクロールバーを移動させたり、キーボード操作でスクロールバーを移動させたりでもいいかなと思っていますので、その方法でも検討してみて分からなければ、もしかすればもう一度こちらに質問させて頂くかもしれません。

ご回答ありがとうございました!

お礼日時:2009/05/25 10:36

結論は出来ます。



リストコントロールの場合は特別な処理はいりません。
リストコントロールのスクロールバーを有効にして、リストにデータをセットすれば、スクロールバーを動かすと勝手に描画領域は更新されます。
ただ、組み込み系ですので、メモリー等のことを考えると仮想リストとして実装する方が無難だと思います。
ちなみに、サムネイル表示も可能です。

ピクチャーコントロールでの実装経験が無いので、具体的な実装方法はわかりませんが、最悪ピクチャーコントロールを利用しなくても、スクロールバーとメモリデバイスコンテキストを使用して、移動量を取得して、自分で描画更新をかければ実装できると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
仮想リストコントロールというのがあるのですね、初耳です。
ネットで調べてみると、仮想リストコントロールというのはリストへのデータの表示が早いみたいですね。
仮想リストを使用する場合に特に普通のリストと、プログラムを作成する点で違う箇所はありますでしょうか?
リストコントロールだと自動でスクロールバーを表示してくれるみたいなのですが、現在開発している機器がタッチパネル式のため、自動で表示されるスクロールバーではタッチするには小さいため、出来れば別で大きい垂直スクロールバーを設置して動かしたいと思っています。
そのようにする場合にはDlgにOnVScroll()のイベントを作成して、その関数内でリスト内の項目を移動させるように処理すればよいのでしょうか?
重ねての質問で申し訳ございませんが、ご回答を宜しくお願い致します。

お礼日時:2009/05/22 09:24

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

QCD/DVD盤への印刷について

初歩的な質問でお恥ずかしいのですが・・・
CD/DVD盤への印刷は直接CD/DVD自体に印刷しているのでしょうか?
それともシールに印刷したものを貼り付けているのでしょうか?
ちなみに、プリンターは二つあってブラザーのMFC-610CLNとレックスマークのX5150なのですが・・・
CDはインクジェットプリンター対応というのを買ったのですが・・・

Aベストアンサー

 両方ともCD/DVDダイレクトプリント機能は無いようです。従って、そのプリンタを使う以上は、ラベル方式しかないでしょう。
 ラベル方式の場合、#1さんが云われるようにうまく貼らないと重心がずれて回転ムラの原因になることがあります。専用のスタンパを使う必要があります。
 又、スリットオンタイプのドライブユニットだと、ラベルが剥がれかけたりして誤動作を生む場合もあります(最悪故障することも・・・)。
 ただ、印刷はラベル方式の方がきれいですし、印刷の耐久性も高いです。

Qリストコントロールのスクロールバーを操作無効にするには

お世話になります、fujicafeと申します。
現在、VC++でMFCのダイアログベースのアプリケーションを作成し、そこでリストコントロールを配置させています。
リストコントロールは自動的に垂直方向のスクロールバーを表示させるようにしています。
そこで質問なのですが、現在、リストコントロールの垂直方向のスクロールをスクロールバーの操作ではなく、キー操作によって行おうと思っているのですがどのようにすればスクロールバーの操作を無効にできますでしょうか?
ポイントとしては
・リストコントロールの自動的に表示させる垂直スクロールバーはそのまま表示させたい(スクロールバーは全体行での現在の行の位置を示すだけ)
・リストコントロールの垂直方向の移動はキー操作でしたい。

これを実現するには、やはりリストコントロールのスクロールバー表示を無しにし、別でスクロールバーを設置させるしか方法はないでしょうか?
現状で、キー操作でのリストコントロールのスクロールバーの操作は実現できていますので、出来ればリストコントロールのスクロールバーの操作の無効のみが出来ればいいなと思っております。
ご意見がありましたら、よろしくお願いいたします。

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

お世話になります、fujicafeと申します。
現在、VC++でMFCのダイアログベースのアプリケーションを作成し、そこでリストコントロールを配置させています。
リストコントロールは自動的に垂直方向のスクロールバーを表示させるようにしています。
そこで質問なのですが、現在、リストコントロールの垂直方向のスクロールをスクロールバーの操作ではなく、キー操作によって行おうと思っているのですがどのようにすればスクロールバーの操作を無効にできますでしょうか?
ポイントとしては
・リストコントロール...続きを読む

Aベストアンサー

>出来ればリストコントロールのスクロールバーの操作の無効のみが出来ればいいなと思っております。

試していないので、アイディアだけですが、WM_NCHITTESTを処理して、HTVSCROLLを返さないようにするのはどうでしょうか?

Qmfc vc++2005 で構成が正しくない・・・

vc++2005 mfcで作成したプログラムで上記が出て他のPCで動きません。
mfc以外はファイルのコピーをするとかだけの単純なツールなのでmfcが
悪さしているとは思います。
mfcをスタティックでリンクにして、コード生成のところのマルチスレッドDLLを
マルチスレッドに変えるとやはりいけますが、別にあったwindows7ではmfcと
コード生成のところを変えなくても問題なくいけました。
vc++2005 redistributable パッケージを入れても変わりません。
mfcは別物なのでしょうか??
ネットを見ているとredistributableパッケージを入れれば大丈夫!!という
感じなのですが。
すいませんがどなたかご教授ください。

Aベストアンサー

>vc++2005 redistributable パッケージを入れても変わりません。

「Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)」
http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=ja

「Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)」
http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displayLang=ja
は、別々にインストールされた…かと思いますが……

さらに、Microsoft Updateで新しいモノが入るかと。
「アプリケーションの追加と削除」には、VC++2005 Redistributableが3つ、
C:\WINDOWS\WinSxSには4つ入っています。
x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_dec6ddd2
x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.91_x-ww_decbdf0c
x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05
x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_b77cec8e

ということで、それぞれでバージョンの食い違いが発生している可能性があるかと。

ちなみに、現在の私の環境でMFCのプロジェクトを作成して、Release版でビルドし、
できたexeファイルをDependency Walkerに食わせて、MFC80U.DLLのプロパティを表示、パスを確認すると…
C:\windows\winsxs\x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.4053_x-ww_b77cec8e
となっていました。

>vc++2005 redistributable パッケージを入れても変わりません。

「Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)」
http://www.microsoft.com/downloads/details.aspx?familyid=32BC1BEE-A3F9-4C13-9C99-220B62A191EE&displaylang=ja

「Microsoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)」
http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&displayLang=ja
は、別々にインストールされた…かと思いますが……

さらに、Microsoft Updateで新...続きを読む

Qリストコントロールのリスト内にスピンコントロールを配置したい

お世話になります。
C++ 6.0 MFC で開発しております。

リストコントロール内に表示させるリスト内にスピンコントロールをつけたいのですが、どのようにすれば実現できるのでしょうか?
※リストを追加するたび、スピンコントロールがついたリストが追加されるようにしたいのです。

説明が載っているサイトでもいいので教えて頂ければありがたいですので
なにとぞよろしくお願いします。

お手数ですが、なにとぞよろしくお願いします。

Aベストアンサー

簡単にやる方法はありません。オナードローににして
自前で描画、またはコントロールを作成し、マウスイベントで
必要なアクションを実装するしかありません。

QMFCに関する質問

C++言語でMFCでアプリケーションを作りたいのですが
MFCというのは、やはり、Visual C++を購入しないと
MFCは手に入りないのでしょうか

それか、どこかで、MFCをダウンロードできるのでしょうか

Aベストアンサー

Microsoft Visual C++ .NET を使った開発などをしていますが、MFC だけ裸で使うというのは大変だと思います。やはり開発環境ともどもというか両者一体ですごく便利に使えるものだと思います。
かつては、UNIX で C でプログラムしていた事もありますが、Visual Studio の開発環境を使うようになってハッキリ言って便利過ぎて驚いています。プログラミングの作業の大半は、API の仕様を調べたりする事ですがその多くをアシストしてくれる環境なので、生産性が数倍以上に上がった気がします。

安いものだと1万円台で買えるものなので、数万円以上した昔に比べれば機能が上がって安いので買っておいて損は無いと思います。もちろん使いこなせなければ宝の持ち腐れですが、誰か使いこなしている人が回りにいれば教えてもらいつつ使うのが良いのではないかと思います。

なお、以前にどこかで互換のある無料版があるらしいとの話を聞いたことがありますが、詳しくはわかりません。

Qタブコントロール上のピクチャーコントロールへの描画

お世話になっております。
VC2005を使用しております。
SDIベースです。
ダイアログを作成し、その上にタブコントロール(2ページ)を作成しました。
タブコントロールの1ページ目にピクチャーコントロールを配置し、ピクチャーコントロール上に描画を行おうと思うのですが、正常に動作しません。
OnPaintの中で描画を行っているのですがだめのようです。
タブコントロール外に、ピクチャーコントロールを配置すると描画する事ができます。
どのような、タイミングで描画を行えばよいのでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

ピクチャーボックスへの描画をどのようにしていますか?
CStatic* pWnd = (CStatic*)GetDlgItem( IDC_PICTURE )
pWnd->SetBitmap( m_bmpImage );
と言った具合にビットマップをピクチャーボックスに張るようにしてはいかがでしょう

ビットマップへの描画は メモリー上にデバイスコンテキスト(DC)を作成しておきこのdcに対して描画を行う
ビットマップをdcに選択
描画終了後に dcから選択を外して
SetBitmapでピクチャーボックスに貼り付け
と言った具合にして見ましょう

メンバー変数として
CStatic m_ctlImage; // ピクチャーボックスに関連付けした変数
CBitmap m_bmpImage; // ピクチャーボックスに貼り付けるイメージ
CDC m_dcImage; // Bitmap描画用のDC
HBITMAP m_holdBmp; // DCへの選択時にビットマップを外すためのハンドル
などを準備します

OnInitDialogなどで
CDC * pDC = m_ctlImage.GetDC();
m_dcImage.CreatecompatibleDC( pDC );
m_bmpImage.CreateCompatibleBitmap( pDC, width, height );
// もともと貼り付けてあったハンドルを保存
// 描画時にビットマップを外すため
// HBITMAP型のメンバー変数 m_holdBmpを準備
m_holdBmp = m_ctlImage.SetBitmap( m_bmpImage );
m_ctl_image.ReleaseDC( pDC );
と言った具合にしておきます

描画イベントで
// ピクチャーボックスのビットマップを外す
m_ctlImage.SetBitmap( m_hOldBmp );
// メモリーDCへビットマップを選択
CBitmap* pOld = m_dcImage.SelelctObject( &m_bmpImage );
// 描画コードを記述
m_dcImage.SetPixel( 100,100, RGB( 255, 0, 0 ) );
// ビットマップの選択を戻す
m_dcImage.SelectObject( pOld );
// ピクチャーボックスへビットマップを設定
m_ctlImage.SetBitmap( m_bmpImage );

と言った具合です

現在どのように描画していて どんな不具合が発生しているのかを明記してみましょう

ピクチャーボックスへの描画をどのようにしていますか?
CStatic* pWnd = (CStatic*)GetDlgItem( IDC_PICTURE )
pWnd->SetBitmap( m_bmpImage );
と言った具合にビットマップをピクチャーボックスに張るようにしてはいかがでしょう

ビットマップへの描画は メモリー上にデバイスコンテキスト(DC)を作成しておきこのdcに対して描画を行う
ビットマップをdcに選択
描画終了後に dcから選択を外して
SetBitmapでピクチャーボックスに貼り付け
と言った具合にして見ましょう

メンバー変数として
CStatic...続きを読む

Qソフトを開くとエラー 「MFC42.DLLがみつからなかったため開けません」の解決法を教えてください

一部のソフトを開こうとすると
「MFC42.DLLが見つからなかったためこのアプリケーションを開けません アプリケーションをインストール直すことでこの問題は解決できると思います」
とのエラーが出て開けません。
この文章はは、データをCD・やDVDに焼こうとする時にもエラーが出て表示されます。
文章を見ると、”インストールし直せば解決できる”とのことなので、グーグルでMFC42.DLLを探してみたのですが、どのソフトなのか、どこからインストールし直せばいいのか、素人知識では全くわかりません。
どなたか解決法をご存知のかた教えてください!

Aベストアンサー

ランタイムライブラリをインストールすればOKです。
Visual Basic 6.0 SP6 ランタイムライブラリ
http://www.vector.co.jp/soft/win95/util/se188840.html

Qスクロールバーコントロールについて質問があります

作成手順
1) IDC_SCROLLBAR1として、リソースエディタで適当な位置に配置

2) 右クリック 「変数の追加」で、コントロール変数の追加
CForm1View に、 CScrollBar m_sbHorz; として、追加される

3) CForm1View::InitialUpdate() で、
// スクロールバーの設定
this->m_sbHorz.SetParent(this);
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::ShowWindow( hWndSb, SW_SHOW );
CRect rectSb;
::GetClientRect( hWndSb, &rectSb );

4) CForm1View::OnDraw() で、
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::SetScrollRange( hWndSb, SB_CTL, this->m_ScMinVal, this->m_ScMaxVal, FALSE );
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );
::ShowWindow( hWndSb, SW_SHOW );
※ m_ScMinVal: 最小値、m_ScMaxVal = 最大値、m_ScPos=現在値 の変数

5) CFomr1View::OnSize()で、
// FormViewのScrollBarを表示させない
SetScrollSizes( MM_TEXT, CSize(cx,cy) );
CWnd::OnSize(nType, cx, cy );

// スクロールバーの位置調整
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::GetClientRect( hWndSb, &rect );
::MoveWindow( hWndSb, 0, cy, cx, rect.Height(), FALSE );
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );

6) CFomr1View::OnHScroll() で、
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::SetScrollPos( hWndSb, SB_CTL, this->m_ScPos, TRUE );


とやると、スクロールバーが表示されません。
何かアドバイスいただけませんか?


また、今、スクロールバーの表示位置調整や、ScrollPosのセットなんかを
Win32API関数使ってますが、MFCで(というか、CScrollBar m_sbHorz; を使って)
できないものなのでしょうか?

よろしくお願いします。

作成手順
1) IDC_SCROLLBAR1として、リソースエディタで適当な位置に配置

2) 右クリック 「変数の追加」で、コントロール変数の追加
CForm1View に、 CScrollBar m_sbHorz; として、追加される

3) CForm1View::InitialUpdate() で、
// スクロールバーの設定
this->m_sbHorz.SetParent(this);
HWND hWndSb;
GetDlgItem(IDC_SCROLLBAR1, &hWndSb);
::ShowWindow( hWndSb, SW_SHOW );
CRect rectSb;
::GetClientRect( hWndSb, &rectSb );

4) CForm1View::OnDraw() で、
HWND hWndSb;
...続きを読む

Aベストアンサー

スクロールバーを何処の設置したいのでしょう?

フォームビューの下端であれば
CFornView::OnSizeにおいて

if ( m_sbHoriz.m_hWnd ) {
  CRect rc;
  m_szHorz.GetWindowRect( &rc );
  m_szHorz.MoveWindow( 0, cy - rc.Height(), cx, rc.Height());
}
といった具合に コントロールのハンドルをチェックして APIを使いましょう

m_szHrzは CFormView::OnInitialUpdate()などでコントロールとリソースが結合されたあとならビュークラスの中で使えますよ
OnSizeはコントロールが初期化される前のビュークラスの生成時にも呼ばれるのでハンドルのチェックが必要です

WinAPIで行っているほとんどの関数はCScrollBarクラスにあると思います
引数の HWNDを省力した形の引数をとると思います

QMFC

Visual StudioのMFC(Microsoft Foundation Class)に関して質問があります。
私は今Visual Studio 2010 Express editionを使用しているのですが、新規作成から共通ヘッダファイルを追加でMFCを追加できません。
これは無料版ではMFCは使えないということでしょうか?
また、有料版ではどれでもMFCは使用可能でしょうか?
特に私は今学生ですのでアカデミック版ではどうでしょうか?

Aベストアンサー

>これは無料版ではMFCは使えないということでしょうか?

はい、使えません。

>また、有料版ではどれでもMFCは使用可能でしょうか?

使用可能です。

>特に私は今学生ですのでアカデミック版ではどうでしょうか?

他の有料版と同じです。

QWin32のリストコントロールで縦スクロールはできませんか?

こんにちは。Win32のリストコントロールについて質問です。

リストコントロールでアイコン表示で使用しています。
リストコントロールでアイコンをたくさん表示させると、縦幅に入る範囲で
アイコンが複数行表示され、入らないアイコンは横スクロールさせることで
表示できますが、これを縦スクロールベースにはできないものでしょうか ?

Aベストアンサー

 こんばんは。要するに、

 →
 [0][1]
 [2][3]
 [4][5]
 [6][7]

 ではなく、
 ↓
 [0][4]
 [1][5]
 [2][6]
 [3][7]

 の様にして追加していきたいと言う事なのでしょうか。
 もしかしたら、ダイアログエディタでリストコントロールの「配置」を「上端」に設定すれば望みどおりの効果が出るかもしれません。
 
 其れでも違うのであるのならば、アイコン表示ですと、カラムの効果が無効になるので、縦に向かって追加していくと言う事は出来ないです(レポートスタイルでないと効き目が無い)。
 http://wisdom.sakura.ne.jp/system/winapi/common/common15.html

 ただ、LVM_SETITEMPOSITIONを実行すると、任意の位置に並べ替えれるので、其れを利用して、縦に向かって並べて、次の列の真上に折り返す、と言った事は出来ます。

 以下のマクロを使った方が楽かもしれません。
 ListView_SetItemPosition(hList/*リストコントロールハンドル*/, itemPosition/*アイテム番号*/, xPixel/*x位置*/, yPixel/*y位置*/)

 以下は30個のアイテムを縦並べ、2列に配置しなおします。参考程度に。

//取りあえず30個アイテムを作る
LVITEM item = {LVIF_TEXT};
TCHAR buf[80];
TCHAR text[128];
for(item.iItem = 0; item.iItem < 30; ++item.iItem)
{
::wsprintf(buf, "%d", item.iItem);
::_tcscpy(text, TEXT("ITEM"));
::_tcscat(text, buf);
item.pszText = text;
ListView_InsertItem(hList, &item);
}

//並べなおし
const int ICONSIZE = 48;//アイコンのサイズ48x48とする
const int COLUMN = 2;//列
for(int y = 0, itemCount = 0; y < (item.iItem / COLUMN); ++y)
{
for(int x = 0; x < COLUMN; ++x)
{
ListView_SetItemPosition(hList, itemCount++, x * ICONSIZE, y * ICONSIZE);
}
}
//アイテムの個数によっては余って並べきれないので、此処でどうにかする

 こんばんは。要するに、

 →
 [0][1]
 [2][3]
 [4][5]
 [6][7]

 ではなく、
 ↓
 [0][4]
 [1][5]
 [2][6]
 [3][7]

 の様にして追加していきたいと言う事なのでしょうか。
 もしかしたら、ダイアログエディタでリストコントロールの「配置」を「上端」に設定すれば望みどおりの効果が出るかもしれません。
 
 其れでも違うのであるのならば、アイコン表示ですと、カラムの効果が無効になるので、縦に向かって追加していくと言う事は出来ないです(レポートスタイルでないと効...続きを読む


人気Q&Aランキング

おすすめ情報