.Net2003 C# にてアプリを作成しています。
.Netを始めて初心者です。(プログラミング経験も浅いです)

ListView1とListView2を作成して、
ListView2がスクロールしたら、ListView1も同じくスクロールさせる
と言ったListViewのスクロールの同期化処理を行いたいのですが、
ソースコードが思いつきません。
ListViewのイベント、プロパティにはスクロール情報を取得するモノが
みつかりませんでした。

現在は下記サイトを参考にさせて頂き、スクロールイベントの発生をキャッチする所までは
なんとかたどり着いたのですが、ここからどうやって
ListView1にスクロール同期化をさせるコードを書いていいのかが
思いつきません。

何か参考になるHPや、コードがありましたら教えてください。

http://dobon.net/vb/dotnet/control/firescrolleve …
から以下コードを参考にしました。
protected override void WndProc(ref Message m)
{
const int WM_HSCROLL = 0x114;
const int WM_VSCROLL = 0x115;

switch (m.Msg)
{
case WM_HSCROLL:
Console.WriteLine(
"水平スクロールバーがスクロールされました。");
break;
case WM_VSCROLL:
Console.WriteLine(
"垂直スクロールバーがスクロールされました。");
break;
}
base.WndProc(ref m);
}

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

A 回答 (2件)

>スクロール量を取得する方法あるのでしょうか?



WM_HSCROLL、WM_VSCROLLが送られてきたときのwParamやlParamの中。

http://msdn.microsoft.com/library/default.asp?ur …

http://msdn.microsoft.com/library/default.asp?ur …
    • good
    • 0
この回答へのお礼

ありがとうございます。
そっちの方にあったんですね、、。
おかげでなんとか、作れそうです。
本当にありがとうございました。

お礼日時:2005/04/22 01:37

スクロールさせたいListViewコントロールのWndProcメソッドを呼び出してください。



そのときに送るメッセージは

LVM_SCROLL
になります。

パラメータの指定方法はurl参照(.NETのリファレンスではありません)
http://msdn.microsoft.com/library/default.asp?ur …
    • good
    • 0
この回答へのお礼

ご回答の方ありがとうございました。
ご指摘して頂いた通りに、やったところ、
なんとかスクロールさせることは出来ましたが、
ListView1をスクロールさせた時のスクロール量を
取る方法がわからないため、うまくListView1と2の同期が
とれません。
スクロール量を取得する方法あるのでしょうか?
教えていただいたリファレンスを見てみたところ、
なさそうだったのですが、、、。

お礼日時:2005/04/21 01:15

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

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

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

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

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

QC#で画像を2値化?したい!

bmpなどの画像データを2値化(0か1の値)にしたいです。

画像は白か黒の2色に設定しておき、
それをC#等で読み込み、2値化し、出力したいのです。

今まで方法がわからず、画像データを見ながら0や1を手入力でしてきたのですが、
量が膨大になってきたので追いつかなくなり、プログラムを組もうと考えました。

色々サイトも見てみたのですが、
方法がよく分かりませんでした。


良いサイト、もしくはプログラムを教えていただけるとうれしいです。
よろしくお願い致します。

Aベストアンサー

今どこまでできているのか?
画像ファイルの選択、各種形式での読み込みなどができているということが前提で

http://chihara.naist.jp/opencv/?%B2%E8%C1%FC%A4%CE2%C3%CD%B2%BD%BD%E8%CD%FD
http://mtws.miniy.net/program/image_filter/
http://homepage3.nifty.com/ishidate/vcpp10_g9/vcpp10_g9.htm
を参考にしてください


言語が違いますがその辺は変換してください。
VCとC#ならほとんど一緒ですし


256色のBMP変換すればバイナリデータで
00 01 01 00 00 01 00 01 ・・・・
などになっているので自然にできると思いますよ。

3つめのURLなら、特にファイル変換も容易だと思います。

Q1 ページスクロール(WM_VSCROLL )が連続で来る

Visual Studio .NET 2003 で VC++ の開発をしています。
OSはW2KとWinMXです。

CViewクラスを基底にした子ウィンドウの 1 ページスクロール(WM_VSCROLLのSB_PAGEDOWN/SB_PAGEUP)時に、スクロールバーのツマミの上下部分をクリックすると、ボタンを押し続けていなくても、ツマミがマウスカーソルのある位置に移動するまでスクロールし続ける現象が出て困っています。

トレースを出したり、Spy++で確認しましたが、正常動作時はWM_VSCROLL(SB_PAGEDOWN/SB_PAGEUP)の後、必ずWM_VSCROLL(SB_ENDSCROLL)メッセージが来ますが、異常動作時はSB_PAGEDOWN/SB_PAGEUP)メッセージが連続して来ています。
ツマミがマウスカーソルの位置に来るとWM_VSCROLL(SB_THUMBPOSITION)メッセージに変わる為、それに対するWM_VSCROLL(SB_ENDSCROLL)メッセージが来て止まるようです。

MicrosoftのMSDNサイトを探してみたのですが、それらしい記述もありませんでした。

この現象の原因、または原因の可能性、回避法等ご存知の方がいらっしゃいましたら是非ご教示ください。
よろしくお願い致します。

Visual Studio .NET 2003 で VC++ の開発をしています。
OSはW2KとWinMXです。

CViewクラスを基底にした子ウィンドウの 1 ページスクロール(WM_VSCROLLのSB_PAGEDOWN/SB_PAGEUP)時に、スクロールバーのツマミの上下部分をクリックすると、ボタンを押し続けていなくても、ツマミがマウスカーソルのある位置に移動するまでスクロールし続ける現象が出て困っています。

トレースを出したり、Spy++で確認しましたが、正常動作時はWM_VSCROLL(SB_PAGEDOWN/SB_PAGEUP)の後、必ずWM_VSCROLL(SB_ENDSCROLL)メッセー...続きを読む

Aベストアンサー

まあ、ゲームプログラミングみたいな物で能動的に取りに行く手段が有ります。

if (GetAsyncKeyState(VK_LBUTTON) & 0x8000) //APIの戻り値の最上位ビットが立っていればボタンが押されている
{
//左ボタンが押された場合の処理
}

if (GetAsyncKeyState(VK_RBUTTON) & 0x8000) //APIの戻り値の最上位ビットが立っていればボタンが押されている
{
//右ボタンが押された場合の処理
}

参考URL:http://www.microsoft.com/japan/msdn/academic/Articles/DirectX/01/

QC#のピクチャボックスにCLIのHBITMAPを

C#のピクチャボックスにC++/CLIのHBITMAPを貼り付けたいです。

方法を教えてくれませんか?

今、考えている方法は以下ですが、中々難しいです。

1.C#側 BitmapからIntPtr型で hDC を取得
 → C++/CLIに渡せない

2.C++/CLIでhDCにHBITMAPを貼り付け
 →IntPtr型を定義できない・・・。

以上、宜しくお願い致します。

Aベストアンサー

HBITMAPからSystem.Drawing.Bitmapを作る話なのになぜHDCが関係するのかわかりませんが……。


まず,HBITMAPからSystem.Drawing.Bitmapを作るには,System.Drawing.Image.FromHbitmapを使います。
http://msdn.microsoft.com/ja-jp/library/k061we7x.aspx

で,HBITMAPはポインタ型なので,System.IntPtrへの変換はSystem.IntPtrのコンストラクタが利用可能です。
また,明示的なキャストでも変換ができます。
http://msdn.microsoft.com/ja-jp/library/z82h6h45.aspx
http://msdn.microsoft.com/ja-jp/library/e4y9h1at.aspx

流れとしては,HBITMAP => IntPtr => Bitmapという変換を行い,
あとはCLIの世界で処理を行えばよいです。

QWM_PAINTとWM_MOVEで同じ事をしたいけど

VC.NETにて、
ウィンドウプロシージャでWM_PAINTとWM_MOVEを拾って、テキストを書き直す関数に飛ばしているのですが、WM_MOVEでは書き直してくれません。
書き直し関数はウインドウの座標の絶対と相対をGetClientRectとGetWindowRectで得て表示をするだけです。
WM_MOVEでも関数に飛んで、座標を得てはいるようですが、表示しなおしてくれません。
ウインドウの大きさを変えると表示し直してくれます。
何故でしょうか?

Aベストアンサー

>hdc = BeginPaint(hWnd, &paint);
と、
>EndPaint(hWnd, &paint);

これはWM_PAINTの中でしか使用できません。

WM_MOVEで描画を行うのでしたらGetDC()、ReleaseDC()を使用してください。

QC++とC#

C,C++と進みC#
Visual C#がありますが
C++とC#の違いを教えてください.
C++とJAVAをたしたようなもの
なのでしょうか?

Aベストアンサー

文法/構文上の類似点は多々ありますが、「別物」です。
その相違について掲示板で列挙できるものではありません。
# 本を読んでください。

QなぜhButton1ボタンからのWM_COMMANDはフックできてクライアントエリアのWM_RBUTTONDOWNはフックできないのでしょうか?

#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc")
#define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc")
#define STRCOMMAND TEXT("ボタンが押されました")


HWND hButton1;



LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam;
HDC hDC;

if(nCode==HC_ACTION)
{
hDC = GetDC(pcwpRetStruct->hwnd);
switch(pcwpRetStruct->message)
{
case WM_COMMAND:
TextOut(hDC, 10, 10, STRCOMMAND, strlen(STRCOMMAND));
break;
case WM_RBUTTONDOWN:
TextOut(hDC, 10, 10, STRRBUTTON, strlen(STRRBUTTON));
break;
}

ReleaseDC(pcwpRetStruct->hwnd, hDC);
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}



LRESULT CALLBACK mainProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static HHOOK hHook;
HDC hDC;

switch(uMsg)
{
case WM_DESTROY:
UnhookWindowsHookEx(hHook);
PostQuitMessage(0);
return 0;

case WM_CREATE:
hHook = SetWindowsHookEx(WH_CALLWNDPROCRET, my_HookProc, NULL, GetCurrentThreadId() );
if(!hHook)
MessageBox(NULL, "hooking failed", NULL, MB_OK);

hButton1 = CreateWindow(
"BUTTON", "hButton1",
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
10, 40, 100, 20,
hWnd, NULL,
((LPCREATESTRUCT)lParam)->hInstance, NULL
);
return 0;

case WM_LBUTTONDOWN:
hDC = GetDC(hWnd);
TextOut(hDC, 10, 10, STRLBUTTON, strlen(STRLBUTTON));
ReleaseDC(hWnd, hDC);
return 0;
}

return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

#define STRLBUTTON TEXT("マウス左ボタンが押されました from mainProc")
#define STRRBUTTON TEXT("マウス右ボタンが押されました from my_HookProc")
#define STRCOMMAND TEXT("ボタンが押されました")


HWND hButton1;



LRESULT CALLBACK my_HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
CWPRETSTRUCT *pcwpRetStruct = (CWPRETSTRUCT *)lParam;
HDC hDC;

if(nCode==HC_ACTION)
{
hDC = GetDC(pcwpRetStruct->hwnd);
switch(pcwpRetStruct->message)
{
case WM_COMMAND:
Tex...続きを読む

Aベストアンサー

WH_CALLWNDPROCRETはSendMessageで送られたメッセージのみを対象とし、WM_xBUTTONDOWNはPostMessageで送られるからです。WH_GETMESSAGEならばWM_xBUTTONDOWNをフックすることができます。

QC#とC++/CLIの連携について

C#とC++/CLIの連携について
C++/CLI側にC#で作成した変数を渡したいのですが、やり方がわかりません。

そもそも一つのソリューションにC++/CLIとC#を混在することはできるのでしょうか。
やはりC++/CLI側はDLLにして、C#がそのDLLを利用するのでしょうか。

Aベストアンサー

.NETの各種言語は混在することができます。
たとえば、C#でGUIの設計をし.NET用DLLを作成し、内部処理をC++でWin32APIを使って書き、C++/CLIでラップして、GUIと結び付ける、とかもできます。

「変数を渡す」というのが表現として良く分かりませんが、変数というよりはクラスを共有する感じになるかと思います。

とはいえC++/CLIはネイティブコードとマネージドコードを混ぜれるがゆえに、逆に色々と問題があるので、ちゃんとネットや本で調べたほうが良いかと思います。

QSendMessage(hW,WM_CREATE,0,0);を

SendMessage(hW,WM_CREATE,0,0);
を実行するとシステムがWM_DOWNやWM_CHARを発行しなくなるみたいです
というのはそれ以降キー入力を無視するようになるのです
いったんアプリをアイコン化してウィンドウ化するとWM_DOWNやWM_CHARを発行するようになります
WM_CREATEを送ってもWM_DOWNやWM_CHARを発行しなくなるのを阻止するために何か方法はないでしょうか?

Aベストアンサー

>プログラムのイニシャライズのために送ったのですが送らないで住むプログラムに変更しました

普通はそんな方法はとりません。
システムが何をするか分からないからです。

自分でメッセージを定義して、初期化処理を行うようするためのメッセージを送るほうが無難です。
WM_CREATEと同じ処理を初期化処理として行わせたいのであれば、初期化処理を関数化して自分で定義したメッセージでも呼び出せばいいのですし。


>作ったプッシュボタンを押してシステムがWM_COMMANDを送ってきた後キー関係のメッセージを送ってくれなくなります

プッシュボタンがキーボードフォーカスを持ってのるでは?

ボタンがキーボードフォーカスを持っていてもキー関連のメッセージを親ウィンドウが受け取りたいのであれば、サブクラス化をするしかないでしょう。

QC++ C# 語源

C++とC#(C++++)はかなり大雑把に言うとCの拡張版ですが、なぜ+が二個単位なのでしょうか。
C → C++ → C#
C+とC+++は存在しないのでしょうか。
C → C+ → C++ → C+++ → C#
もし存在しないのであれば、どのような理由でそうなったのでしょうか。

Aベストアンサー

C/C++のインクリメント演算子が、++だからじゃないでしょうか。

Q「void ( *signal(int sig, void (*func)(int)) ) (int)」の (int)

signal関数の書式についてですが、

  void ( *signal(int sig, void (*func)(int)) ) (int);

最後に付く(int)は一体何でしょうか?
このような関数の書式ははじめて見ました。
UNIX系の何かでしょうか。
回答よろしくお願いします。

Aベストアンサー

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換えると
void (*A)(int);
となり、Aを戻すと
void (*signal(int signum, void (*sighandler)(int)))(int);
となる。
)

typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t sighandler);
より後半部分のtypedefを置き換えると
sighandler_t signal(int signum, void (*sighandler)(int));
つぎに戻り値の部分のtypedefを置き換えると
void (*signal(int signum, void (*sighandler)(int)))(int);
となります。
(
sighandler_t signal(int signum, void (*sighandler)(int));
の「signal(int signum, void (*sighandler)(int))」をAと置き換えて
sighandler_t A;
からtypedefを置き換...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング