
こんにちは。
いつもお世話になっております。
小生、只今WindowsXPSP3上で、C言語とWin32APIを使用し、BCC5.5.1でコンパイルしながら、Windowsプログラミングを勉強しています。
度々、質問させて頂き、その都度回答を頂戴し、誠に恐縮ではあるのですが、今回も質問させて下さい。
下記のコードをコンパイルすると、タイトルバーをドラッグして移動する事は出来るのですが、ウィンドウ全体(クライアント領域も含めて)移動するにはどのようにすればいいのでしょうか??
/* ウィンドウ表示 */
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE, LPCSTR);
BOOL InitInstance(HINSTANCE, int, LPCSTR);
int WINAPI WinMain(
HINSTANCE hCurInst,
HINSTANCE hPrevInst,
LPSTR lpsCmdLine,
int nCmdShow)
{
MSG msg;
BOOL bRet;
LPCSTR szClassName = "Window";
if(!InitApp(hCurInst, szClassName)){
return FALSE;
}
if(!InitInstance(hCurInst, nCmdShow, szClassName)){
return FALSE;
}
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){
if(bRet == -1){
MessageBox(NULL, "GetMessage Error", "Error", MB_OK);
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(
NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName)
{
HWND hWnd;
hWnd = CreateWindow(
szClassName,
"Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
200,
200,
NULL,
NULL,
hInst,
NULL);
if(!hWnd){
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
switch(msg){
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
お忙しい中申し訳ございませんが、
先輩方、アドバイス宜しくお願い致します。
No.4ベストアンサー
- 回答日時:
#3です。
すみません。#3で紹介したサイトの情報を良く見ていませんでした。
#3のコードだと、クライアント領域上でダブルクリックすると、「最大化」、または、
「元のサイズに戻す」の動作が実行されてしまいますね。
(これはこれで、面白い動作ですが。。。)
ですので、これで支障がある場合は、同サイトの【方法2】の方法を採った方が、
良いと思います。
以下は、【方法2】のコード例です。
ウィンドウプロシージャ「WndProc」の部分のみ掲載致します。
■改造ソース(その2)
注)インデント等のため、全角スペースを入れています。
ご使用の際は、半角スペースorタブに置換して下さい。
/////↓ここから///////////////////////////////////
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
// UINT nRes;
//メッセージ処理
switch(msg)
{
//////こちらは使用しない///////////
// //マウス移動のメッセージ処理
// case WM_NCHITTEST:
// //クライアント領域だった場合は、タイトルバー上での動作と
// //同じ動作を行わせる
// nRes = DefWindowProc(hWnd, msg, wp, lp);
// if (nRes == HTCLIENT) nRes = HTCAPTION;
// return nRes;
////////////////////////////////
//マウスの左ボタン押下時の処理
case WM_LBUTTONDOWN:
//クライアント領域だった場合でも、タイトルバーでクリック
//されたことにしてメッセージ送信
PostMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, lp);
break;
//プログラム終了時のウインドウ破棄
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
/////↑ここまで///////////////////////////////////
以上です。
ご回答頂き誠にありがとうございます。
提示して頂いたコードをコンパイルし、実行してみると、
見事、クライアント領域をドラッグしてウィンドウを移動させる事が出来ました!!
しかも、サイトのURLまで掲載して頂いて。。。
誠に感謝申し上げあげます。
No.3
- 回答日時:
こんにちは。
> タイトルバーをドラッグして移動する事は出来るのですが、ウィンドウ全体
> (クライアント領域も含めて)移動するにはどのようにすればいいのでしょうか?
最初、上記の意味がよく解らなかったのですが、
#1さんの回答を見て、
『クライアント領域で、マウスドラッグされた場合でも、
タイトルバー上で、マウスドラッグされた場合と同様に、
ウィンドウ全体を移動させたい。』
という意味だと理解できました。
方法は、#1さんの方法で対処可能だと思います。
ただし、#1さんが紹介されたリンク先サイトのやり方は、
タイトルバーが無いウィンドウアプリ
での方法ですので、それをそのまま、
タイトルバーが有るウィンドウアプリ
で使用すると、
タイトルバーの「システムコマンド」(最小化、最大化、閉じる、など)
の処理が機能しなくなってしまうようです。
それを回避するには、下記サイトの方法で対処可能だと思います。
◎タイトルバー以外の部分をドラッグしてウィンドウを移動させる
http://hp.vector.co.jp/authors/VA023539/tips/win …
参考までに、上記サイトの方法を、ご提示のソースに加味したソース
を掲載致します。
宜しければ、試してみて下さい。
■改造版ソース
注)インデント等のため、全角スペースを入れています。
ご使用の際は、半角スペースorタブに置換して下さい。
/////↓ここから///////////////////////////////////
/* ウィンドウ表示(改造版)*/
#include <windows.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
ATOM InitApp(HINSTANCE, LPCSTR);
BOOL InitInstance(HINSTANCE, int, LPCSTR);
//WinMain
int WINAPI WinMain(
HINSTANCE hCurInst,
HINSTANCE hPrevInst,
LPSTR lpsCmdLine,
int nCmdShow)
{
MSG msg;
BOOL bRet;
LPCSTR szClassName = "Window";
if(!InitApp(hCurInst, szClassName)){
return FALSE;
}
if(!InitInstance(hCurInst, nCmdShow, szClassName)){
return FALSE;
}
while((bRet = GetMessage(&msg, NULL, 0, 0)) != 0){
if(bRet == -1){
MessageBox(NULL, "GetMessage Error", "Error", MB_OK);
break;
}
else{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
//ウィンドウクラスの登録
ATOM InitApp(HINSTANCE hInst, LPCSTR szClassName)
{
WNDCLASSEX wc;
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = WndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hCursor = (HCURSOR)LoadImage(
NULL,
MAKEINTRESOURCE(IDC_ARROW),
IMAGE_CURSOR,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
wc.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = (LPCSTR)szClassName;
wc.hIconSm = (HICON)LoadImage(
NULL,
MAKEINTRESOURCE(IDI_APPLICATION),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE | LR_SHARED);
return (RegisterClassEx(&wc));
}
//ウィンドウの生成
BOOL InitInstance(HINSTANCE hInst, int nCmdShow, LPCSTR szClassName)
{
HWND hWnd;
hWnd = CreateWindow(
szClassName,
"Window",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
200,
200,
NULL,
NULL,
hInst,
NULL);
if(!hWnd){
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
return TRUE;
}
//ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
UINT nRes;
//メッセージ処理
switch(msg)
{
//マウス移動のメッセージ処理
case WM_NCHITTEST:
//クライアント領域だった場合は、タイトルバー上での動作と
//同じ動作を行わせる
nRes = DefWindowProc(hWnd, msg, wp, lp);
if (nRes == HTCLIENT) nRes = HTCAPTION;
return nRes;
//プログラム終了時のウインドウ破棄
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return (DefWindowProc(hWnd, msg, wp, lp));
}
return 0;
}
/////↑ここまで///////////////////////////////////
以上です。参考になれば幸いです。
この回答への補足
ご回答頂き、ありがとうございます。
>> タイトルバーをドラッグして移動する事は出来るのですが、ウィンドウ全体
>> (クライアント領域も含めて)移動するにはどのようにすればいいのでしょうか?
>最初、上記の意味がよく解らなかったのですが、
よく意味の分からない質問内容を記述してしまい、
申し訳ございません。
これからは、よく考え、何度も読み直して質問したいと思います。
ご教授ありがとうございました。
No.1
- 回答日時:
>タイトルバーをドラッグして移動する事は出来るのですが、ウィンドウ全体(クライアント領域も含めて)移動するにはどのようにすればいいのでしょうか??
クライアント上に他のコントロールなどが乗っている場合は、また違いますが…
WM_NCHITTESTの応答で可能です。
# http://win32lab.com/tips/tips17.html
ただし……クライアント領域をタイトルバーと同等の扱いをすることになりますので、
他で不具合があるかも知れません。
ご回答頂き誠にありがとうございます。
提示していただいた、サイトをこれからも参考に勉強したいと思います。
誠に感謝申し上げます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- FX・外国為替取引 mql4のコンパイルエラー箇所の修正お願いします。 1 2023/03/15 16:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー Run-Time Check Failur...
-
プログラミングでエラーが出ま...
-
オーバーレイみたいな処理がしたい
-
エディットボックスの背景の色...
-
return文がない場合の戻り値は...
-
別関数に渡す変数のポインタが...
-
WM_CREATE について
-
ウィンドウ非表示に時に表示し...
-
ボタンの色(WINAPI)
-
ウィンドウのサイズ変更について
-
C#のswitch文を簡略化したいの...
-
Win32APIでウィンドウを中央に...
-
ダイアログプログラムでEnterキ...
-
不明なエラー
-
数字以外が入力されたらエラー...
-
2÷3などの余りについて
-
Enterキーを押されたら次の処理...
-
java初心者です。入力されたの...
-
「指定されたキャストは有効で...
-
「Aに対するBの割合」と「Aに対...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エディットボックスの背景の色...
-
ウィンドウ非表示に時に表示し...
-
エラー Run-Time Check Failur...
-
Win32APIにて、ウィンドウ全体...
-
ボタンの色(WINAPI)
-
ダイアログプログラムでEnterキ...
-
C#のswitch文を簡略化したいの...
-
オーバーレイみたいな処理がしたい
-
Win32APIでウィンドウを中央に...
-
プログラミングでエラーが出ま...
-
ツリーコントロールの開閉アイ...
-
なぜhButton1ボタンからのWM_CO...
-
C言語win32api、エディットボッ...
-
LoadImageとSetCursorについて
-
コンソールアプリケーションの...
-
画像を表示したいのですが……
-
MoveToExとLineToについて
-
ウィンドウのサイズ変更について
-
ボタンのアイコン表示
-
トラックのループの仕方
おすすめ情報