透明なウィンドウの枠だけが消えない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はぐるま
記事: 5
登録日時: 12年前
連絡を取る:

透明なウィンドウの枠だけが消えない

#1

投稿記事 by はぐるま » 12年前

C++で、透明なウィンドウを作成したく、プログラムを書いたところ、
タイトルバーは消えるのですが、ウィンドウの枠だけが消えません。
画像
どのようにしたら、枠まで消えるのでしょうか。
ご教示お願いします。
以下、枠だけ残ってしまうプログラム

コード:

#include <windows.h>
#include <tchar.h>

// 定数
#define WINDOW_WIDTH  (400)		// ウィンドウの幅
#define WINDOW_HEIGHT (300)		// ウィンドウの高さ
#define WINDOW_X ((GetSystemMetrics( SM_CXSCREEN ) - WINDOW_WIDTH ) / 2)
#define WINDOW_Y ((GetSystemMetrics( SM_CYSCREEN ) - WINDOW_HEIGHT ) / 2)

// プロトタイプ宣言
HWND Create(HINSTANCE hInst);
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp);


// 開始位置
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd)
{
	HWND hWnd;
	MSG msg;

	// ウィンドウを作成する
	hWnd = Create( hInst );
	if( hWnd == NULL )
	{
		MessageBox( NULL, _T("ウィンドウの作成に失敗しました"), _T("エラー"), MB_OK );
		return 1;
	}

	// ウィンドウを表示する
	ShowWindow( hWnd, SW_SHOW );
	UpdateWindow( hWnd );

	// メッセージループ
	while( 1 )
	{
		BOOL ret = GetMessage( &msg, NULL, 0, 0 );  // メッセージを取得する
		if( ret == 0 || ret == -1 )
		{
			// アプリケーションを終了させるメッセージが来ていたら、
			// あるいは GetMessage() が失敗したら( -1 が返されたら )、ループを抜ける
			break;
		}
		else
		{
			// メッセージを処理する
			TranslateMessage( &msg );
			DispatchMessage( &msg );
		}
	}

	return 0;
}

// ウィンドウを作成する
HWND Create(HINSTANCE hInst)
{
	WNDCLASSEX wc;

	// ウィンドウクラスの情報を設定
	wc.cbSize = sizeof(wc);               // 構造体サイズ
	wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;   // スタイル
	wc.lpfnWndProc = WndProc;             // ウィンドウプロシージャ
	wc.cbClsExtra = 0;                    // 拡張情報1
	wc.cbWndExtra = 0;                    // 拡張情報2
	wc.hInstance = hInst;                 // インスタンスハンドル
	wc.hIcon = (HICON)LoadImage(          // アイコン
		NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON,
		0, 0, LR_DEFAULTSIZE | LR_SHARED
	);
	wc.hIconSm = wc.hIcon;                // 子アイコン
	wc.hCursor = (HCURSOR)LoadImage(      // マウスカーソル
		NULL, MAKEINTRESOURCE(IDC_ARROW), IMAGE_CURSOR,
		0, 0, LR_DEFAULTSIZE | LR_SHARED
	);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // ウィンドウ背景
	wc.lpszMenuName = NULL;                     // メニュー名
	wc.lpszClassName = _T("Default Class Name");// ウィンドウクラス名
	
	// ウィンドウクラスを登録する
	if( RegisterClassEx( &wc ) == 0 ){ return NULL; }

	// ウィンドウを作成する
	return CreateWindowEx(
		WS_EX_LAYERED,         //拡張ウィンドウスタイル
		wc.lpszClassName,      // ウィンドウクラス名
		_T("Sample Program"),  // タイトルバーに表示する文字列
		WS_POPUP | WS_BORDER,   // ウィンドウの種類
		WINDOW_X,              // ウィンドウを表示する位置(X座標)
		WINDOW_Y,              // ウィンドウを表示する位置(Y座標)
		WINDOW_WIDTH,          // ウィンドウの幅
		WINDOW_HEIGHT,         // ウィンドウの高さ
		NULL,                  // 親ウィンドウのウィンドウハンドル
		NULL,                  // メニューハンドル
		hInst,                 // インスタンスハンドル
		NULL                   // その他の作成データ
	);
}

// ウィンドウプロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp)
{
	HDC hDC;
	LPCTSTR STR = _T("Layer");
	switch( msg )
	{
	case WM_CREATE:
		SetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 100, LWA_COLORKEY); 

	case WM_NCHITTEST: // ウィンドウ上のどこをマウスで掴んでも、位置を移動できるようにする
            return HTCAPTION;

	case WM_PAINT:		// 描画すべきタイミングで送られてくる
		hDC = GetDC(hWnd);
		TextOut(hDC, 0, 0, STR, strlen(STR));
		ReleaseDC(hWnd,hDC);
		return 0;

	case WM_DESTROY:  // ウィンドウが破棄されるときに送られてくる
		PostQuitMessage( 0 );
		return 0;
	}

	return DefWindowProc( hWnd, msg, wp, lp );
}

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 透明なウィンドウの枠だけが消えない

#2

投稿記事 by taketoshi » 12年前

>>WS_POPUP | WS_BORDER,

ここをWS_OVERLAPPEDWINDOWでどうでしょうか。

はぐるま
記事: 5
登録日時: 12年前
連絡を取る:

Re: 透明なウィンドウの枠だけが消えない

#3

投稿記事 by はぐるま » 12年前

taketoshiさん、早速の回答ありがとうございます。
WS_OVERLAPPEDWINDOWにしてみましたが、
普通のウィンドウのように、タイトルバーが出てきてしまいます。

taketoshi
記事: 222
登録日時: 14年前
住所: 日本国

Re: 透明なウィンドウの枠だけが消えない

#4

投稿記事 by taketoshi » 12年前

>>WS_POPUP

のみにしたところウインドウの線が消えました。
お試しください。

はぐるま
記事: 5
登録日時: 12年前
連絡を取る:

Re: 透明なウィンドウの枠だけが消えない

#5

投稿記事 by はぐるま » 12年前

taketoshiさん、有難うございました。
ぶじかいけつしました。

閉鎖

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