DXライブラリの時刻表示で、うまくいきません

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

DXライブラリの時刻表示で、うまくいきません

#1

投稿記事 by ゴルスラ » 15年前

DXライブラリで時刻表示を作ってみたのですが、時刻は表示されるのですが、clsDx();で毎回消しているはずなのに、何故か重なって表示されます。
どうすればいいでしょうか?
回答、お願いしますm(__)m

ソースコード:

#include "DxLib.h"
#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ){ return -1; }

DATEDATA Date; //時間データ

for(;;){
if( ProcessMessage() == -1 ){ break ;}
clsDx();
SetDrawScreen(BACK);
GetDateTime( &Date ) ; //時間取得
printfDx("現在時刻:%d年%d月%d日、%d時%d分%d秒",Date.Year,Date.Mon,Date.Day,Date.Hour,Date.Min,Date.Sec);
ScreenFlip();
}

DxLib_End();
return 0;
}

nns

Re:DXライブラリの時刻表示で、うまくいきません

#2

投稿記事 by nns » 15年前

とりあえずSetDrawScreenは最初の1回だけでいいのでは?

ookami

Re:DXライブラリの時刻表示で、うまくいきません

#3

投稿記事 by ookami » 15年前

#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)
↑これですと、1行目のは無効になりますね。2行目のも意図どおりには行かないです。

SetDrawScreen(FRONT)でも
SetDrawScreen(BACK)でも
SetDrawScreen(hoge)でも
SetDrawScreen(DX_SCREEN_FRONT)に展開されます。

さじ加減の迷うところですが、私ならこの場合はdefineを使わないです。

あと、未確認ですがprintfDxではなくDrawStringFで試してみてください。 画像

ゴルスラ

Re:DXライブラリの時刻表示で、うまくいきません

#4

投稿記事 by ゴルスラ » 15年前

nnsさん、ookamiさん、お早い回答有難うございます。
#defineの所ですが、どうすればいいのでしょうか?
また、DrawStringFがなかったようなので、DrawFormatStringかな?とおもって、こっちでやりました。
ですが、まだ正しく表示されません。
また、よろしくお願いします。
ソースコード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode( TRUE ) ; // ウインドウモードに変更
if( DxLib_Init() == -1 ){ return -1; }

DATEDATA Date; //時間データ

SetDrawScreen(DX_SCREEN_BACK);
for(;;){
if( ProcessMessage() == -1 ){ break ;}
clsDx();
GetDateTime( &Date ) ; //時間取得
DrawFormatString(0,0,GetColor(255,255,255),"現在時刻:%d年%d月%d日、%d時%d分%d秒",Date.Year,Date.Mon,Date.Day,Date.Hour,Date.Min,Date.Sec);
ScreenFlip();
}

DxLib_End();
return 0;
}

ideyan

Re:DXライブラリの時刻表示で、うまくいきません

#5

投稿記事 by ideyan » 15年前

ClearDrawScreen()
を使ってバックバッファを初期化してみてはどうですか?

ookami

Re:DXライブラリの時刻表示で、うまくいきません

#6

投稿記事 by ookami » 15年前

> rawFormatStringかな?
す、すみません(汗) それです。余計な手間をおかけしてしまいました。

#define SetDrawScreen(BACK) SetDrawScreen(DX_SCREEN_BACK)
#define SetDrawScreen(FRONT) SetDrawScreen(DX_SCREEN_FRONT)
↑この2行を消して、メインループの中の
SetDrawScreen(BACK)

SetDrawScreen(DX_SCREEN_BACK)
に変えます。

ゴルスラ

Re:DXライブラリの時刻表示で、うまくいきません

#7

投稿記事 by ゴルスラ » 15年前

>>ideyanさん
ClearDrawScreen();ですが、時刻の表示はできますが、背景画像とか、文とかが全部消えてしまうので使えません。

>>ookamiさん
ということは、SetDrawScreen(BACK);
と短縮して書くことはできないということでしょうか?

#define DrawStringF DrawFormatString
↑のようなのは大丈夫でしょうか?:DrawStringF("表示"); 画像

ideyan

Re:DXライブラリの時刻表示で、うまくいきません

#8

投稿記事 by ideyan » 15年前

printfDx()はバッファ(?)に文字をためていき、
ScreenFlip()をするときに一気に描画するとリファレンスにあります。
clsDx()で消えるのはこのバッファに溜まっている文字です。

ClearDrawScreen()を使わない場合、バックバッファには前回描画したものが
そのまま残っています。
DrawFormatString()を使うにせよ、printfDx()を使うにせよ、
クリアせずに前回の描画の上から違う文字列を書いているだけなので
文字は重なって当然です。

>背景画像とか、文とかが全部消えてしまうので使えません。
背景画像とか文も毎回描画しなおしじゃダメですか?

全部描画しなおすのがどうしても嫌だというなら、
時計を表示してる場所の背景部分を黒で塗り潰すとか、専用の画像を用意するなりして
その部分だけでも毎回描画するという方法もあるかと思います。

ookami

Re:DXライブラリの時刻表示で、うまくいきません

#9

投稿記事 by ookami » 15年前

背景画像の表示はどこで(ループの外で?)やってるのでしょうか?


> SetDrawScreen(BACK);
と短縮して書きたい場合は、
int BACK=DX_SCREEN_BACK;

とするか、

#define BACK DX_SCREEN_BACK

ですかね。BACKという名前が他でかぶのを避けるために、ちと曲解ですが

#define SETDRAWSCREENBACK() SetDrawScreen(DX_SCREEN_BACK)

として

SETDRAWSCREENBACK();

と使うか。()はなくてもいいですが。

>#define DrawStringF DrawFormatString
>↑のようなのは大丈夫でしょうか?
大丈夫です。

えぇと…私の理解では↓
■defineのパラメータの例

#define a(b) A(b)
a(hoge) → A(hoge) に展開。bをhogeに置換。

#define a(b) A(B)
a(hoge) → A(B) に展開。b がないので置換がない。

ゴルスラ

Re:DXライブラリの時刻表示で、うまくいきません

#10

投稿記事 by ゴルスラ » 15年前

>>ideyanさん
最終的にはやっぱりめんどくさい方法をとらなければいけないんですね^^;

>>ookamiさん
intを使ってみます。

返信ありがとうございました^^
最終的にはすべて再描写することにしました。

ほげほげ

popenによる通信

#11

投稿記事 by ほげほげ » 15年前

送信側から受信側へ文字列を送信し,表示させたいんですけど,うまくいきません.
環境はmacのxcodeです.
よろしくお願いします.

受信側 (popen_test)

int main (int argc, char * const argv[/url]) {
while(1){
if(!feof(stdin)){
char a[10];
fread(a,sizeof(char),5,stdin);
printf("%s",a);
}

}
return 0;
}

送信側
int main (int argc, char * const argv[/url]) {
FILE *gid=popen("./popen_test","w");
while(1){
fwrite("abc",sizeof(char),5,gid);
sleep(1);
}
return 0;
}

たかぎ

Re:popenによる通信

#12

投稿記事 by たかぎ » 15年前

> うまくいきません.

どうなることを期待し、どううまくいかないのでしょう?

ほげほげ

Re:popenによる通信

#13

投稿記事 by ほげほげ » 15年前

送信側から受信側へ文字列を送信し,表示させたいんです.
送信側の実行ファイルからpopenで受信側の実行ファイルを呼び出してfwriteで送信側から文字列データを送信する度に受信側でデータを取得することができるのを目指しています.
その間受信側のプロセスは終了しないようにしたいのですが,どうすればいいですか?現段階ではfwrite,freadが全く機能していない様子です.反応がありません.

たかぎ

Re:popenによる通信

#14

投稿記事 by たかぎ » 15年前

一通り送信し終わって、パイプをクローズしたときに受信が行われます。

Poco

Re:popenによる通信

#15

投稿記事 by Poco » 15年前

fwrite()の後で、fflush()をしてみては?

ほげほげ

Re:popenによる通信

#16

投稿記事 by ほげほげ » 15年前

fflush
を入れましたが,うまくいきませんでした.
方法は問いませんが何かこの問題を解く方法はないでしょうか?


送信側から受信側へ文字列を送信し,表示させたいんです.
送信側の実行ファイルから受信側の実行ファイルを呼び出して送信側から文字列データを送信する度に受信側でデータを取得することができるのを目指しています.その間受信側のプロセスは終了しません.

Poco

Re:popenによる通信

#17

投稿記事 by Poco » 15年前

popenではなく、より低レベルのAPI(含むシステムコール)を使用してみては?
pipe, fork, exec*辺りを使用することをお勧めします。

#マック持ってないんで、外していたらゴメンナサイ。

たかぎ

Re:popenによる通信

#18

投稿記事 by たかぎ » 15年前

> popenではなく、より低レベルのAPI(含むシステムコール)を使用してみては?

その方がよいと思います。

閉鎖

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