LRESULT CALLBACK の case WM_PAINT: で、

hdc = BeginPaint(hWnd, &ps);
TextOut(hdc,0,0,str,strlen(str));
EndPaint(hWnd, &ps);

↑問題無し。↓文字がちらつく。

hdc = GetDC(hWnd);
TextOut(hdc,0,0,str,strlen(str));
ReleaseDC(hWnd,hdc);

ちらつきの原因は、高速で TextOut( ) が繰り返されるから
だと思いました。
どうして TextOut( ) が繰り返されるんですか?

上の方法の場合は、
ReleaseDC(hWnd,hdc);
は書かなくてもいいですか?

A 回答 (4件)

基本的にWM_PAINTの場合はBeginPaintを使うほうがいい気がします。


というのはWM_PAINT時には再描画領域等の情報が設定されてきて
BeginPaintを使うと必要のない領域には描画されないはずです。
GetDCを使用するとこの情報は取得できず、Window全体に対して描画されるので
再描画の必要のない領域まで描画することになってしまいます。
ちなみに繰り返しとありますが、実際に繰り返されてるのは確かめられたのでしょうか?
    • good
    • 0
この回答へのお礼

BeginPaint では、窓の右に半分重なっていた別の窓が
消えた場合、窓の全てを再描画するのではなく、
窓の右半分だけを描画するということですね。
知りませんでした。ありがとうございます。

繰り返し については、窓のちらつきを見た感じで
予想したことです。

お礼日時:2001/12/07 21:49

M_PAINTは無効化された(再描画が必要な)領域が在ると


送られてきますが、キューから取り除くには
マウスやタイマのメッセージのように単にメッセージを
処理すると取り除かれるのではなく、無効化された(再描画が必要な)
領域が無くなったときに除かれます。
BeginPaint、EndPaintは無効化された領域を処理しますが、
GetDCは無効化された領域とは関係なしに動作しますので、
依然として無効化された(再描画が必要な)領域が残ったままとなり
WM_PAINTがキューに存在し続けるわけです。
ReleaseDCの後にValidateRectで無効化された領域を消してやれば
GetDCの方も描画が繰り返されると言うことは無くなりますが、
これはお勧めしません。
    • good
    • 0
この回答へのお礼

hdc = GetDC(hWnd);
TextOut(hdc,0,0,str,strlen(str));
ValidateRect(hWnd,NULL);
ReleaseDC(hWnd,hdc);

これでちらつく問題が解決しました。

窓が隠れていれば、常に UINT に WM_PAINT が入るんですね。
ありがとうございます。

お礼日時:2001/12/07 22:16

GetDC(),RelaseDC()のペアではメッセージキュー内のWM_PAINTメッセージが処理されず、無限にWM_PAINTが呼ばれつづけます。


そのためTextOutが呼ばれつづけちらつくのでしょう(ビデオカードのドライバによってはV-SYNCに同期して描画するためちらつかないものもあります)。

そのためWM_PAINTメッセージのハンドラではBeginPaint()、EndPaint()のペアを使う必要があります。尚、BeginPaint()、EndPaint(9を使う場合、ReleaseDC()する必要はありません。
    • good
    • 0
この回答へのお礼

ちらつきは、
 switch (msg){
 case WM_PAINT:
の中の GetDC( ),RelaseDC( ) のペアによって
UINT に WM_PAINT が入るせいで case WM_PAINT
が無限に繰り返していたからだったんですね。

ReleaseDC( ) が必要ないということもありがとうございます。

お礼日時:2001/12/07 21:56

何の関数の中のcase文なんでしょうか?



ReleaseDC() は自分で GetDC() を記述したのでなければやってはいけません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
上の例では ReleaseDC( ) を書いてはいけないんですね。

お礼日時:2001/12/07 21:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QWM_PAINT

WM_PAINT について教えてほしいのですが、

WM_PAINTがシステムから発行されるタイミングとして、

クライアント領域に無効領域がある時
UpdateWindow()を呼び出した時
InvalidateRect()を呼び出した時があると思いますが




例えば

LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) {

LPCTSTR  Str = TEXT("Kitty");

switch (msg) {

case WM_CREATE:
   hdc = GetDC(hwnd);
   SetTextColor(hdc , RGB(255, 0 , 0));
   ReleaseDC(hwnd , hdc);
   return 0;

case WM_PAINT:
   hdc = BeginPaint(hwnd , &ps);
   TextOut(hdc, 10 , 10 , Str, lstrlen(Str));
   EndPaint(hwnd , &ps);
   return 0;
}
return DefWindowProc(hwnd , msg , wp , lp);
}


の場合, WM_PAINTはどのタイミングでシステムから呼び出されるんですか?
WinMain()でUpdateWindow()もInvalidateRect()もつかっていないのですが。

いつシステムから送られるかご教授をお願いします。

WM_PAINT について教えてほしいのですが、

WM_PAINTがシステムから発行されるタイミングとして、

クライアント領域に無効領域がある時
UpdateWindow()を呼び出した時
InvalidateRect()を呼び出した時があると思いますが




例えば

LRESULT CALLBACK WndProc(HWND , UINT , WPARAM , LPARAM) {

LPCTSTR  Str = TEXT("Kitty");

switch (msg) {

case WM_CREATE:
   hdc = GetDC(hwnd);
   SetTextColor(hdc , RGB(255, 0 , 0));
   ReleaseDC(hwnd , hdc);
   return 0;...続きを読む

Aベストアンサー

たぶん、作成したウィンドウを最初に表示した時にUpdateWindow等を呼んでないのに何故WM_PAINTが送られてきているのかを知りたいのだと思って回答します。
たしか、
 
・ウィンドウスタイルにWS_VISIBLEを指定している場合は、CreateWindow(Ex)を呼んだ時
・WS_VISIBLEを指定してない場合はShowWindowでウィンドウを表示した時
 
に最初のWM_PAINTが送られて来たと思います。
これは「クライアント領域に無効領域がある時」に該当します。
 
記憶に頼って書いているので、違ってるかもしれません。自分でブレークポイントとかを張ってみて確かめてみて下さい。
 

QDWORDの実際の型は何でしょうか

VC++.NETの環境です。
DOWRD dw1 = 1;
int i = 2; と定義し
ここで
if ( i > dw1 ){
何かの処理;
}
とコーディングすると
warning C4018: '>' : signed と unsigned の数値を比較しようとしました。
のワーニングがでます。
これは、DWORDがint型でなくunsigned int型のようにも見えます。
ある本によれば(VC++.V.NET逆引き大全500の極意)
DWORD はint型であると記述されています。
もし、int型ならこのワーニングはでないはずなのですが、
なぜでるのでしょうか。又、DWORDの実際の型は何なのでしょうか。ご存じのかたおりましたら、教えていただけませんでしょうか。

Aベストアンサー

型定義が知りたいのならば、宣言ファイルを見れば疑問を挟む余地もありません。
DWORD型はwindef.hで
"typedef unsigned long DWORD;"
と宣言されています。

Visual Studioを使っているのならば、知りたい型の上にマウスポインタを置いて右クリック、ポップアップメニューの「定義へ移動」または「宣言へ移動」で簡単に知ることが出来ます。

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Qリソースエディタでスタティックテキストの文字サイズの変更

 VisualStudio を使っています。
 リソースエディタで、作成したダイアログ・ボックス中に貼り付けた、
スタティックテキスト(Static Text)の文字サイズの変更を個別にしたいのです。

 ダイアログのプロパティには、フォントとサイズを変更できるようになっていますが、個々のスタティックテキストには、ありません。

 どうすれば、一番良いのでしょうか?
 教えてください。

 よろしくお願いします。

 

Aベストアンサー

WM_INITDIALOGの中でフォントを指定すればよいでしょう。
(MFCならCStatic::SetFont)

case WM_INITDIALOG:
{
HWND hStatic = GetDlgItem(hWnd , IDC_STATIC1 );
HFONT hFont = CreateFont(16,
0,
0,
0,
FW_REGULAR,
FALSE,
FALSE,
TRUE,
ANSI_CHARSET,
OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,
PROOF_QUALITY,
DEFAULT_PITCH,
_T("MS ゴシック") );
SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont, TRUE);
}

参考URL:http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200211/02110110.txt

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qwsprintf関数の使い方について

いつもお世話になっております。
 
いまいち、分からなくて質問しました。
 
 
int hp=60;

としたとき、
 
TextOut(.............,hp,lstrlen(hp));

としようと思ってたんですけど、
 
文字がでないので、
 
 
wsprintf((LPWSTR)nowhp,"%d",hp);

としたら、エラーがでて実行できませんでした。
 
TextOut関数で、60とだしたいのですが、
その後の処理で値が変わってくるので
 
TextOut(......................,TEXT("60")..........)
 
ともできず、困っています。 
 
 
要は
wsprintfに値を格納して
その後の処理で
 
hp-=10
 
としても、
wsprintfでnowhpに値を格納し
TextOutで50と表示されるようにしたいのです。
 
 
うまく説明できませんが、↑のようにする方法を
 
教えてください。
 
お願いします。

Aベストアンサー

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので,
TCHAR nowhp[11];
if (FAILED(StringCbPrintf(nowhp, sizeof(nowhp) / sizeof(nowhp[0]), TEXT("%d"), hp))
{
// 失敗時処理
}
のようにした方がよいでしょう。

なんか怪しげなキャストが見えますが……。

wsprintfは文字列を扱うWin32 APIなので,wsprintfAとwsprintfWがあります。
int WINAPI wsprintfA (char *, const char *, ...);
int WINAPI wsprintfW (wchar_t *, const wchar_t *, ...);
なので,wsprintfとして使う場合は,全てTCHAR系で統一する必要があります。
TCHAR nowhp[11];
wsprintf(nowhp, TEXT("%d"), hp);

ただし,
MSDN: wsprintf function (Windows)
http://msdn.microsoft.com/es-ar/library/ms647550
には,wsprintfは使うな,と書いてありますので...続きを読む

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

Qwsprintf( ポインタ , "%d" , "123" );

char str[100];
char *ptr;

wsprintf(str, "%d", "1234567");

wsprintf(ptr, "%d", "1234567");
について、
TextOut(hDC,0,10,str,lstrlen(str));
TextOut(hDC,0,30,ptr,lstrlen(ptr));
で出力したいんだけど、str ならできたけど、
ptr の方が文字化けしていました。

lstrlen(ptr); がいけないのかと思って、
その値を調べたら 0 でした。

strlen( ) はポインタに対応していると思いました。

#include <iostream.h>
main(){
char *p = "あいう";
cout << strlen(p);
}

で 6 だったから。
Win32 の lstrlen( ) はポインタに対応していないんですか?

Aベストアンサー

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先が、システムの領域だったら、「不正なアクセス」が起きて、プログラムが落ちます。Linuxだと「Segmentation fault」です。

後、配列とポインタは同じものと思っておいても通常差しつかえありません。array[a] は *(array + a) の様に解釈されます。そのため

int array[3] = { 1,2,3 };
printf("%d, %8x\n", array[0], &array[0]);
printf("%d, %8x\n", 0[array], &0[array]);
printf("%d, %8x\n", array[1], &array[1]);
printf("%d, %8x\n", 1[array], &1[array]);
printf("%d, %8x\n", array[2], &array[2]);
printf("%d, %8x\n", 2[array], &2[array]);

を実行してみてください。ただし、わかりにくくなるトリッキーな書き方なので、使わないのが普通です。

> new char[100];
この場合、char 型で、100個分確保して、そのポインタが返ります
new int[50] だったら int 型50個分
もちろん、型だけでなく、クラスも指定出来ます。
new string[50]

> 0065FE08, 0065FE0C, 0065FE10
> で、&ptr が 0065FE00 だったとすると、
> (ptr+2) = "aaa";
*(ptr+2) = "aaa"; の間違いですよね^^;

> としたら、sonota[] の値が変更されてしまうしいうことですね?
変更されますが、変更される値は"aaa"のポインタが、sonata[0]以降に格納されます。

書き換える先...続きを読む

Qダイアログ表示時にチェックボックスにチェックされている状態にするには?

ダイアログ内にチェックボックスを作成して、
そのダイアログを呼出した時に、
チェックボックスがチェックされている状態にするには、
どのようにしたら良いのでしょうか?
(リソースで出来る事と出来ない事の区別がまだついてません)

Aベストアンサー

こんにちは。itohhといいます。

開発環境が解らないのですが...

VC++6.0のMFCを使用してプログラミングを行っていると思ってアドバイスします。

チェックボックスにメンバ変数をCButtonクラスで割り当ててください。
割り当てたメンバ変数名を仮にm_Checkとします。

以下の文を適当な関数に入れてください。
ダイアログを表示するときから、ONにしたいのならば、OnInitDialogイベントに入れればいいでしょう。

チェックボックスをONにする場合。
m_Check.SetCheck(1);
チェックボックスをOFFにする場合。
m_Check.SetCheck(0);

詳しいことはMSDNライブラリの「CButtonクラス」を参照してください。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング