ウィンドウズメッセージの競合?を解消したい。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
s707

ウィンドウズメッセージの競合?を解消したい。

#1

投稿記事 by s707 » 14年前

デスクトップクロックを制作中です。
開発環境はWindows7,C++,DXライブラリです。

特定の座標を左クリックすると日付や時刻を
音声再生するのですが

ウィンドウプロシージャの下記のコードに影響されて
音声を再生できません。
左クリックでウィンドウを移動させるものなのですが。

コード:

case WM_LBUTTONDOWN:
		SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);
		break;
こちらをコメントアウトすればウィンドウの移動は
出来なくなりますが音声は再生できます。


メッセージの送信方法を変えれば解決できるでしょうか?
ご助力の程、よろしくお願い致します。

コード:

//main.cpp
#include <windows.h>
#include <process.h>
#include <WindowsX.h>
#include "DxLib.h"
#include "dayData.h"
#include "draw_clock.h"
#include "Setup.h"
#include "resource.h"
#include <windowsx.h>

#define APP_NAME TEXT("clock")
#define chara_width 64

void jihou(struct dayData* day);
void plan(struct dayData* day);
void Time(struct dayData* day);
void date(struct dayData* day);

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL CALLBACK MyDlgProc(HWND hChild, UINT msg, WPARAM wp, LPARAM lp);

static HWND hDlg[2];
static int chara_id;
HINSTANCE hInst;
POINT pt;
struct dayData day[471];

LRESULT CALLBACK WindowProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
	static int top = 0;
	HMENU hMenu,hSubMenu;

	switch(uMsg) {
	case WM_MOVING:
		{		
			LPRECT p = (LPRECT)lParam;
			top = p -> top;
			break;
		}
	case WM_WINDOWPOSCHANGING:		
		{
			WINDOWPOS* p = (WINDOWPOS*)lParam;
			p -> y = top;
			break;
		}
	case WM_NCHITTEST:
		return HTCAPTION;
	case WM_LBUTTONDOWN:
		SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);
		break;
	case WM_RBUTTONDOWN:
		pt.x = LOWORD(lParam);
		pt.y = HIWORD(lParam);		

		hMenu = LoadMenu(hInst,"MYMENU");
		hSubMenu = GetSubMenu(hMenu ,0);
		ClientToScreen(GetMainWindowHandle() , &pt);
		TrackPopupMenu(hSubMenu,TPM_LEFTALIGN,pt.x,pt.y,0,GetMainWindowHandle(),NULL);
		DestroyMenu(hMenu);
		break;
	case WM_COMMAND:
		switch(LOWORD(wParam)){
		case IDM_OPTION:
			if(!hDlg[0])hDlg[0] = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG), GetMainWindowHandle(), MyDlgProc);
			break;
		case IDM_EXIT:
			SendMessage(hWnd, WM_CLOSE, 0, 0);
			break;
		case IDM_VERSION:
			ShellAbout(hWnd,"DesktopClock#""DesktopClock Ver1.00","Copyright(C) 2012 S.Ohira",NULL);
			break;
		}
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	}
	return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){
	if(FindWindow(APP_NAME , NULL) != NULL ){
		MessageBox(NULL , TEXT("多重起動を確認しました") , NULL , MB_OK);
		return 0;
	}

	// マウス状態管理用変数
	int nClickNow = 0 , nClickPrev = 0;
	int nClickNow_R = 0 , nClickPrev_R = 0;
	int nClickR_Count = 0;

	int status = 0,temp = 0;
	bool menu_flg = false;

	// 画面モードの変更
	SetGraphMode( 1680 , 1050 , 32 ) ;//パソコンの解像度に合わせる

	SetMainWindowText("clock");
	ChangeWindowMode( TRUE );
	//	SetWindowText( "DxLib:" DXLIB_VERSION_STR );

	SetUseBackBufferTransColorFlag( TRUE );// ウインドウの透過色モードON
	SetWindowStyleMode(2);
	SetAlwaysRunFlag( TRUE );

	SetHookWinProc( WindowProc );
	if ( DxLib_Init( ) == -1 ) return -1;

	SetDrawScreen(DX_SCREEN_BACK);

	Load_Graph();
	Setup_load(day);//設定を読み込む
	plan(day);//予定を音声再生する	

	while ( ProcessMessage( ) == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) {
		ClearDrawScreen( );

		draw_face(day);
		draw_clock(day);

		// マウス状態の更新
		nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);
		
		if( nClickNow != nClickPrev){
			int MouseX = 0,MouseY = 0;
			GetMousePoint( &MouseX , &MouseY ) ;// マウスの位置を取得

			if(MouseX > chara_x && MouseX < chara_x + chara_width && MouseY > chara_y && MouseY < chara_y + chara_width ){
				date(day);//日付を再生
				Time(day);//時刻を再生
				plan(day);
			}
		}else{
			//SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);
		}

		// 今回のクリック状態を保持する
		nClickPrev = nClickNow;

		jihou(day);//全ての描画関数が終わってから呼ぶ

		ScreenFlip( );
	}
	DxLib_End( );
	return 0;
}

アバター
tk-xleader
記事: 158
登録日時: 15年前
連絡を取る:

Re: ウィンドウズメッセージの競合?を解消したい。

#2

投稿記事 by tk-xleader » 14年前

s707 さんが書きました:メッセージの送信方法を変えれば解決できるでしょうか?
そうですね。WM_NCLBUTTONDOWNを、PostMessageでメッセージキューにポストすればいいと思います。

YuO
記事: 947
登録日時: 15年前
住所: 東京都世田谷区

Re: ウィンドウズメッセージの競合?を解消したい。

#3

投稿記事 by YuO » 14年前

WM_LBUTTONDOWNはLPARAMに左ボタンを押したクライアント座標が入りますから,それを元に再生させたい場所かどうかを判定して,
再生させたい場所であればWM_NCLBUTTONDOWNを送らないようにしてみてはどうでしょうか。

s707

Re: ウィンドウズメッセージの競合?を解消したい。

#4

投稿記事 by s707 » 14年前

tkmakwins15様、YuO様ご返信ありがとうございます。
座標を参照ということでしたので、以前から使っていた
こちらのコードをコピペしました。

キャラクター画像をクリックして、マウスを動かさない状態だと
音声が2回連続で再生されるものの、大方出来ました。

あと少しで解決できそうです。

コード:

case WM_LBUTTONDOWN:
		{
			int MouseX = 0,MouseY = 0;
			GetMousePoint( &MouseX , &MouseY ) ;// マウスの位置を取得

			if(MouseX > chara_x && MouseX < chara_x + chara_width && MouseY > chara_y && MouseY < chara_y + chara_width ){
			}else{
				SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//キャラクター画像の座標以外の時
			}
			break;
		}

s707

Re: ウィンドウズメッセージの競合?を解消したい。

#5

投稿記事 by s707 » 14年前

メイン関数のコードをWM_LBUTTONDOWNに移動することで解決しました。
ありがとうございます。

コード:

  
case WM_LBUTTONDOWN:
		{
	        // マウス状態管理用変数
	        int nClickNow = 0 , nClickPrev = 0;

			// マウス状態の更新
			nClickNow = (GetMouseInput() & MOUSE_INPUT_LEFT);

			if( nClickNow != nClickPrev){
				int MouseX = 0,MouseY = 0;
				GetMousePoint( &MouseX , &MouseY ) ;// マウスの位置を取得

				if(MouseX > chara_x && MouseX < chara_x + chara_width && MouseY > chara_y && MouseY < chara_y + chara_width ){
					date(day);//日付を再生
					Time(day);//時刻を再生
					plan(day);
				}
			}
			SendMessage(GetMainWindowHandle(), WM_NCLBUTTONDOWN, HTCAPTION, 0);//キャラクター画像の座標以外の時

			// 今回のクリック状態を保持する
			nClickPrev = nClickNow;
			break;
		}

閉鎖

“C言語何でも質問掲示板” へ戻る