0から始めるVisualStudio2022:ソフト開発塾
クロスカーソル的なものを表示する。
前回 のプロジェクトを追加&修正
追加したしたソースは
#include <windows.h>
//
// mp_mode : 1 : 消去のみ 2: OLD表示
// 1,2の場合、mp_x,mp_y は、無視
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y, int mp_mode) {
RECT rect;
GetClientRect(mp_hWnd, &rect);
static int mm_old_flag = 0;
static int mm_x_old, mm_y_old, mm_x1_old, mm_y1_old, mm_x2_old, mm_y2_old;
HDC mm_hdc;
mm_hdc = GetDC(mp_hWnd);
//POINT pt;
SetROP2(mm_hdc, R2_NOTXORPEN);
HPEN mm_hPen;
HGDIOBJ mm_hPenOld;
//mm_hPen = ExtCreatePen(PS_GEOMETRIC, 5, &lb, 0, NULL);
mm_hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
mm_hPenOld = SelectObject(mm_hdc, mm_hPen);
if (mm_old_flag || mp_mode==2) {
MoveToEx(mm_hdc, mm_x_old, mm_y1_old, NULL);
LineTo(mm_hdc, mm_x_old, mm_y2_old);
MoveToEx(mm_hdc, mm_x1_old, mm_y_old, NULL);
LineTo(mm_hdc, mm_x2_old, mm_y_old);
mm_old_flag = 0;
}
if (mp_mode) {
if (mp_mode == 2) {
mm_old_flag = 1;
}
}
else {
mm_x1_old = rect.left;
mm_y1_old = rect.top;
mm_x2_old = rect.right;
mm_y2_old = rect.bottom;
mm_x_old = mp_x;// LOWORD(lPara);
mm_y_old = mp_y;// HIWORD(lPara);
MoveToEx(mm_hdc, mm_x_old, mm_y1_old, NULL);
LineTo(mm_hdc, mm_x_old, mm_y2_old);
MoveToEx(mm_hdc, mm_x1_old, mm_y_old, NULL);
LineTo(mm_hdc, mm_x2_old, mm_y_old);
mm_old_flag = 1;
}
SelectObject(mm_hdc, mm_hPenOld);
DeleteObject(mm_hPen);
ReleaseDC(mp_hWnd, mm_hdc);
}
//
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y) {
cross_cursor(mp_hWnd, mp_x, mp_y, 0);
}
//
void cross_cursor(HWND mp_hWnd, int mp_mode) {
if (mp_mode) {
cross_cursor(mp_hWnd, 0, 0, mp_mode);
}
}
こんな感じ。
ヘッダー用は
#pragma once
void cross_cursor(HWND mp_hWnd, int mp_mode);
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y);
void cross_cursor(HWND mp_hWnd, int mp_x, int mp_y, int mp_mode);
こんな感じ。
前に行った様に、ダイアログに、スタティックテキストを配置 。
IDを、IDC_TEXT1 に変更
ソース(dialog.cpp)を修正
WM_MOUSEMOVE に追加
case WM_MOUSEMOVE: {
cross_cursor(hDlg, LOWORD(lPara), HIWORD(lPara));
char mm_buff[128];
sprintf_s(mm_buff, sizeof(mm_buff), "(%d:%d) ", LOWORD(lPara), HIWORD(lPara));
SetDlgItemTextA(hDlg, IDC_TEXT1, mm_buff);
break;
}
まぁ、まぁ、まぁ
って、感じのかなぁ。
とりあえず、タイマを停止して、気に入らないところを洗い出し。
//SetTimer(hDlg, IDT_TIMER1, 1000 / 4, (TIMERPROC)NULL);
気に入らないところ
1.マウスがウィンドウから外れた時十字ラインが残る。
2.スクロールを行ったとき、十字ラインが残る&現れる。
3.趣旨から外れているが、スクロールを行ったとき、スタティックテキスト及びボタンがズレる。
対策:
WM_PAINT の前後に
cross_cursor(hDlg, 1);
と
cross_cursor(hDlg, 2);
を追加しただけで、スタティックテキスト及びボタン以外まぁクリアかなぁ
つづく
Top 次