開発環境:Visual C++ 2008 / Windows Vista
ツールバーに,ある図形のアイコン(toolbar.bmp)を作り,それをクリックすると,
自作したカーソルファイル(cursor1.cur)を読み込み,カーソルがその図形に変わる。
ソースの一部は以下の通りです。
case WM_COMMAND:
switch (LOWORD(wp)) {
case ID_BUTTON1:
HCURSOR hCur;
hCur = (HCURSOR)LoadImage(GetModuleHandle(0),
MAKEINTRESOURCE(IDC_CURSOR1), IMAGE_CURSOR, 0, 0,
LR_SHARED);
SetCursor(hCur);
Sleep(1000);
break;
このあと,フォームに変化したカーソルを持って行き,
任意の場所でその図形を描画したい(左クリックで置くなど)のですが,方法がわかりま
せん。
アドバイスいただけるとありがたいです。
よろしくお願いします。
カーソルを変えたいのかカーソルを描画したいのかtoolbar.bmpを描画したいのかよくわ
からんにゃい。
ドラッグ中を除いてSetCursorはWM_SETCURSORから呼びだす。
WM_SETCURSORの使い方を理解しておくこと。
フォームって何?
HCURSOR hCur;がWM_COMMAND内の局所変数だとだめだね。
WM_SETCURSOR内で使えなくなってるから。
カーソルについては,矢印から自作のカーソルに変えることはできたので大丈夫なんで
す。
フォームというのは,「入力の可能なウィンドウ」っていう認識で合っているかわかり
ませんが,
要するにウィンドウっていうことでしょうか…。(逆に質問で返すのはおかしいんです
けれども)
今,まさに文章を書き込んでいるところもフォームと呼ぶと思います。
Visual C++で,Windowsフォームアプリケーションを作成するなどという呼び方もしま
す。
Visual C++で,とりあえず何も実行しないウィンドウを作ったのですが,そこのことで
す。
メニューとツールバーは作りました。
話を戻して,ツールバーに作成したアイコンをクリックしたら,
自作したcursor1.curというファイルを読み込み,その形にカーソルを変更できました。
例えば◎っていう形に変更したとします。
その後,カーソルを動かし,クリックしたら◎をポンと描画したいんです。
だから,cursor1.curで作ったものを描画したいということです。
ついでにその瞬間,元の矢印カーソルに戻せれば。
まるでスタンプを押すような感じ?
アクセサリのペイントは,ペンなどで点や線を描けますが,
似たような感じで自作したビットマップファイルやカーソルファイルを,
そのように動作できないものかと悩んでいます。
とりあえず,WM_SetCursorについて調べることと,
hCurはグローバルにしておきます。
ありがとうございました。
以下は、全部カンで書いているので正しいか知らない。
カーソルなので座標にオフセットが必要だな。
HCURSOR hCur = NULL;
int type = 0;
struct Shape { int x, y, type; };
std::vector< Shape > data;
--略--
case ID_BUTTON1:
hCur = (HCURSOR)LoadImage(--略--IDC_CURSOR1--略--);
type = ID_BUTTON1;
--略--
--略--
case WM_SETCURSOR:
if(hCur != NULL) {
--略--
}
--略--
--略--
case WM_LBUTTONDOWN:
if(hCur != NULL) {
Shape s;
s.x = マウスの座標
s.y = マウスの座標
s.type = type;
data.push_back(s);
DrawIcon(hdc,s.x,s.y,hCur);
--略--
}
--略--
--略--
WM_PAINT
--略--
hCur = (HCURSOR)LoadImage(--略--IDC_CURSOR1--略--);
for(vector< Shape >::iterator i=v.begin();i!=v.end();i++) {
if(i.type == ID_BUTTON1) DrawIcon(hdc,i.x,i.y,hCur);
}
--略--