ウィンドウリサイズ時のちらつきについて

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

ウィンドウリサイズ時のちらつきについて

#1

投稿記事 by ゆういちろう » 13年前

お昼に別件でトピックを立てたのですが、
他に解決できない問題がありますので、ご助力をお願いいたします。
環境は、VC2008(C言語・SDK、ダイアログベース)です。

ウィンドウリサイズ時のコントロールなどのちらつきなのですが、
ダブルバッファをすれば大丈夫だろうと思っていたのですがうまくいきません。

具体的には、下のようなソースなのですが、
ダブルバッファするにも、ビットマップを表示するなどの処理をしているわけではないので、
WM_PAINTに何かをすべきなのかもわかりません。

ちらつきをなくす方法、ご教授いただけないでしょうか。

main.c

コード:

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include "resource.h"

BOOL CALLBACK WndProc(HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
{
	static HWND hText;			//スタティックテキストのハンドル
	static RECT init_dlg_rc;	//親ウィンドウの初期領域を格納
	static RECT cur_dlg_rc;		//親ウィンドウの移動後の領域を格納
	static RECT text_rc;		//スタティックテキストの領域を格納
	static POINT mv_pos;		//親ダイアログの初期状態からの移動幅を格納

	switch (msg){
		case WM_INITDIALOG :
			{
				hText = GetDlgItem(hDlg, IDC_TEXT1);

				// 親ウィンドの初期スクリーン領域取得
				GetWindowRect(hDlg, &init_dlg_rc);

				//スタティックテキストのクライアント領域取得
				GetWindowRect(hText, &text_rc);
				MapWindowPoints(NULL, hDlg, &text_rc, 2);
			}
			break;

		case WM_SIZING:
			{
				//現在の親ウィンドウのスクリーン領域を取得
				memcpy(&cur_dlg_rc, (RECT*)lp, sizeof(RECT));

				//親ウィンドウが初期状態からどれだけ動いた計算
				mv_pos.x = (cur_dlg_rc.right - init_dlg_rc.right) + (init_dlg_rc.left - cur_dlg_rc.left);
				mv_pos.y = (cur_dlg_rc.bottom - init_dlg_rc.bottom) + (init_dlg_rc.top - cur_dlg_rc.top);

				//スタティックテキストを移動
				MoveWindow(hText,	text_rc.left, 
									text_rc.top,
									text_rc.right - text_rc.left + mv_pos.x, 
									text_rc.bottom - text_rc.top + mv_pos.y,
									FALSE);

				//再描画
				InvalidateRect(hDlg, NULL, FALSE);
			}
			break;

		case WM_CLOSE:		//×ボタン
			EndDialog(hDlg, 0);
			return TRUE;

		default:
			break;
	}

	return FALSE;
}


int WINAPI WinMain(HINSTANCE hThisInst,HINSTANCE hPrevInst,LPSTR lpszArgs,int nWinMode)
{
	//ウィンドウ起動
	DialogBox(NULL,MAKEINTRESOURCE(IDD_DIALOG1),NULL,(DLGPROC)WndProc);

	return 0;
}
resource.h

コード:

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Wintest20120816.rc
//
#define IDD_DIALOG1                     101
#define IDC_TEXT1                       1001

// Next default values for new objects
// 
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40001
#define _APS_NEXT_CONTROL_VALUE         1004
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
main.rc

コード:

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"

#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"

/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS

/////////////////////////////////////////////////////////////////////////////
// 日本語 resources

#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN)
#ifdef _WIN32
LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
#pragma code_page(932)
#endif //_WIN32

#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//

1 TEXTINCLUDE 
BEGIN
    "resource.h\0"
END

2 TEXTINCLUDE 
BEGIN
    "#include ""afxres.h""\r\n"
    "\0"
END

3 TEXTINCLUDE 
BEGIN
    "\r\n"
    "\0"
END

#endif    // APSTUDIO_INVOKED


/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//

IDD_DIALOG1 DIALOGEX 0, 0, 267, 141
STYLE DS_SETFONT | DS_CENTER | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_WINDOWEDGE
CAPTION "Dialog"
FONT 12, "MS UI Gothic", 400, 0, 0x80
BEGIN
    CONTROL         "ちらつきが消えません。\nなんとか消せないでしょうか。",IDC_TEXT1,"Static",SS_LEFTNOWORDWRAP | WS_BORDER | WS_GROUP,12,8,246,122,WS_EX_CLIENTEDGE
END


/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//

#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO 
BEGIN
    IDD_DIALOG1, DIALOG
    BEGIN
        LEFTMARGIN, 12
        RIGHTMARGIN, 258
        TOPMARGIN, 8
        BOTTOMMARGIN, 130
    END
END
#endif    // APSTUDIO_INVOKED

#endif    // 日本語 resources
/////////////////////////////////////////////////////////////////////////////



#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//


/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: ウィンドウリサイズ時のちらつきについて

#2

投稿記事 by へにっくす » 13年前

WS_CLIPCHILDREN
は試しましたか?
written by へにっくす

ゆういちろう

Re: ウィンドウリサイズ時のちらつきについて

#3

投稿記事 by ゆういちろう » 13年前

へにっくす様

返信ありがとうございます。
返事が遅くなりまして、申し訳ありません。

提示しましたソースにWS_CLIPCHILDRENがありませんね・・・。
しかし、提示しているソースとは違う、手元の本ソースではつけており、それでもちらつきがあります。
やはりWM_SIZINGのタイミングで再描画し続けるのが原因なんでしょうか・・・。

先日、同僚から、再描画するInvalidateRect関数の第2引数に、リサイズ時の差分矩形を与えてやるとちらつきが軽減するのではないかとアドバイスをいただきました。
まだ試してはいませんが、この方法でアプローチしてみたいと思います。
またわかり次第、報告させていただきます。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: ウィンドウリサイズ時のちらつきについて

#4

投稿記事 by ISLe » 13年前

ちらつきとは、テキストボックスのテキストが点滅する症状のことですか?

クライアント全体を無効領域にするといったん背景色で消去されるので点滅しますね。

InvalidateRectを使わなくても、MoveWindowで再描画を有効にすれば最小限の無効領域を設定してくれるみたいですけど。

閉鎖

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