カウントダウンタイマー

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

カウントダウンタイマー

#1

投稿記事 by zero » 14年前

初めまして、zeroと申します。
よろしくお願いします。
カウントダウンタイマーに関する記事を検索したのですが
ほしい情報が載っていませんでした。
それでトピを立てました。

OSはwindows7 64bit
言語はwin32api
使ってるソフトはMicrosoft Visual Studio 2010

やりたいことは時間を自分で入力してそれをカウント

0になったらタイマーがなるようにしたいです。

(問題の部分)

自分で入力した数字をCreateWindow(TEXT("EDIT"),(TEXT("%c"),str3),の部分に表示させたいのですがうまく表示されません。

あと、ボックス内をクリックして入力をしたりすると開始と停止が勝手に有効と無効に切り替わります。

入力をしても有効と無効が勝手に切り替わらないようにするにはどうしたらいいでしょうか?

わかる方教えていただけませんしょうか?

下記にソース

コード:

#include <Windows.h>
#define x 150
#define y 180

static HWND kaisi;
static HWND teisi;
HINSTANCE hinstance;
static TCHAR str[128],str2[128],str3[128];

LRESULT CALLBACK wndproc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) 
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	SYSTEMTIME stime;

	switch(msg){
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		SetTimer(hwnd,1,300,NULL);
		return 0;
	case WM_TIMER:
		GetLocalTime(&stime);
		wsprintf(str,TEXT("%d年 %d月 %d日\n%d時 %d分 %d秒"),
			stime.wYear,	stime.wMonth,	stime.wDay,
			stime.wHour,	stime.wMinute,	stime.wSecond);
		SetWindowText(hwnd,str);
		InvalidateRect(hwnd,NULL,TRUE);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		GetClientRect(hwnd , &rect);
		DrawText(hdc , str , -1, &rect , DT_LEFT);
		EndPaint(hwnd , &ps);
	return 0;
		case WM_COMMAND:
		if(LOWORD(wp) == 0) {
			if(IsWindowEnabled(kaisi)) EnableWindow(kaisi , FALSE);
			else  EnableWindow(kaisi , TRUE);
			if(IsWindowEnabled(teisi)) EnableWindow(teisi , FALSE);
			else  EnableWindow(teisi , TRUE);
		}
		return 0;
		case WM_CHAR:
			hdc=GetDC(hwnd);
			wsprintf(str2,(LPTSTR)&wp);
			wsprintf(str3,str2);
			ReleaseDC(hwnd,hdc);
			return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}


int WINAPI WinMain(HINSTANCE hinstance ,HINSTANCE hprevinstance , PSTR lpcmdline , int ncmdshow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS win;

	win.style			= CS_HREDRAW | CS_VREDRAW ;
	win.lpfnWndProc		= wndproc;
	win.cbClsExtra		=win.cbWndExtra	=0;
	win.hInstance		=hinstance;
	win.hIcon			=LoadIcon(NULL,IDI_APPLICATION);
	win.hCursor			=LoadCursor(NULL,IDC_ARROW);
	win.hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);
	win.lpszMenuName	=NULL;
	win.lpszClassName	=TEXT("練習");

	if(!RegisterClass(&win))	return -1;

	hwnd = CreateWindow(TEXT("練習"),TEXT("練習"),
					WS_VISIBLE |(WS_OVERLAPPEDWINDOW & ~(/*WS_MINIMIZEBOX|*/WS_MAXIMIZEBOX)),
					50,50,
					x,y,
					NULL,NULL,hinstance,NULL);

	kaisi=CreateWindow(TEXT("BUTTON"),TEXT("開始"),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
				0,70,50,30,hwnd,NULL,hinstance,NULL);
	
	teisi=CreateWindow(TEXT("BUTTON"),TEXT("停止"),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
				55,70,50,30,hwnd,NULL,hinstance,NULL);

			
	CreateWindow(TEXT("EDIT"),(TEXT("%c"),str3),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER,
				0,40,100,30,hwnd,NULL,hinstance,NULL);



	if(hwnd == NULL)	return -1;

	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage( &msg );
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

へにっくす

Re: カウントダウンタイマー

#2

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

とりあえずざっと見た感じで回答すると、、
zero さんが書きました:自分で入力した数字をCreateWindow(TEXT("EDIT"),(TEXT("%c"),str3),の部分に表示させたいのですがうまく表示されません。
ボタンのハンドルは得ているのに、何で"EDIT"のハンドルは取得していないの?
取得していればいくらでもそのハンドルに対してSetWindowTextすれば変更できるのに。
"EDIT"に入力した文字を取得したいならGetWindowTextで取得できます。
zero さんが書きました:あと、ボックス内をクリックして入力をしたりすると開始と停止が勝手に有効と無効に切り替わります。
入力をしても有効と無効が勝手に切り替わらないようにするにはどうしたらいいでしょうか?
当たり前。WM_COMMANDメッセージの内容を判定しないで有効無効の切り替え処理を走らせてるんだから。。
そもそもボタンの"開始"と"終了"、"EDIT"のコマンドIDを渡していないですね。
ウィンドウの配下にあるコントロールはすべてコマンドIDというものを持っています。
それはCreateWindow関数を呼ぶときに指定する必要があります。
(簡単に言うと、WS_CHILDを指定するときは、hMenuに当たる引数にコマンドIDを自分で定義して渡す必要があるってこと)
第28章 ボタンを使う - 猫でもわかるプログラミング
http://www.kumei.ne.jp/c_lang/sdk/sdk_28.htm

あと言えることは、wndproc関数について
switchのcaseごとにreturn 0;しているのは変です。
以下のようにreturn 0;は最後にしておいて、
DefWindowProc関数を呼ぶのはdefault:の後にした方がいいですよ。

コード:

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	int wmId, wmEvent;
	PAINTSTRUCT ps;
	HDC hdc;

	switch (message)
	{
	case WM_COMMAND:
		wmId    = LOWORD(wParam);
		wmEvent = HIWORD(wParam);
		// 選択されたメニューの解析:
		switch (wmId)
		{
		case IDM_ABOUT:
			DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
			break;
		case IDM_EXIT:
			DestroyWindow(hWnd);
			break;
		// ボタンやエディットのコントロールIDもここで分岐する
		default:
			return DefWindowProc(hWnd, message, wParam, lParam);
		}
		break;
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		// TODO: 描画コードをここに追加してください...
		EndPaint(hWnd, &ps);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	return 0;
}

へにっくす

Re: カウントダウンタイマー

#3

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

へにっくす さんが書きました:当たり前。WM_COMMANDメッセージの内容を判定しないで有効無効の切り替え処理を走らせてるんだから。。

コード:

case WM_COMMAND:
if(LOWORD(wp) == 0) {
    if(IsWindowEnabled(kaisi)) EnableWindow(kaisi , FALSE);
    else  EnableWindow(kaisi , TRUE);
    if(IsWindowEnabled(teisi)) EnableWindow(teisi , FALSE);
    else  EnableWindow(teisi , TRUE);
}
return 0;
すみません判定はしてましたね。
LOWORD(wp)はコマンドIDを示すものなので、この処理は正しいですが、
0と比較してるのはおかしいです。
この0にはボタンや"EDIT"をCreateWindowするときに渡したIDの値がきます。
たとえば開始ボタンに1000を、停止ボタンに1001を渡したなら、1000と比較することになります

へにっくす

Re: カウントダウンタイマー

#4

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

連続投稿すみません m(__;)m
へにっくす さんが書きました:すみません判定はしてましたね。
LOWORD(wp)はコマンドIDを示すものなので、この処理は正しいですが、
0と比較してるのはおかしいです。
この0にはボタンや"EDIT"をCreateWindowするときに渡したIDの値がきます。
たとえば開始ボタンに1000を、停止ボタンに1001を渡したなら、1000と比較することになります
ちなみにエディットボックスのIDもここにくる可能性があるので、それも考慮しないといけませんよ
やっぱコマンドIDごとにswitch~caseするべきだな・・・

zero

Re: カウントダウンタイマー

#5

投稿記事 by zero » 14年前

へにっくす さんへ
レスありがとうございます。
自分でも工夫してやってみます。
ありがとうございました。

zero

Re: カウントダウンタイマー

#6

投稿記事 by zero » 14年前

再びアドバイスもらいにもどってきました。

開始と停止が勝手に有効と無効に切り替わるのは問題解決したのですが・・・

タイマーの時間設定でソースの書き方がいまいちわかりません。

SetLocalTime関数で時間を設定してやろうとしてもうまく表示されず(時間がでたらめな数字 5248時5428分5248秒になる)

スクロールバーコントロールで時間を00時00分00秒で▲マーククリックしても数字はかわらなくて困っています

新しく別のプログラムで横(水平)からの▲マークの方では0から増えていくのはできたのですが垂直だと増えませんでした。

スクロールバーコントロールのcase SB_LEFT: case SB_RIGHTをUPとDWONに変更すると定義されていませんってなって設定ができません。

教えてください。

よろしくお願いします。

コード:

 
#include <Windows.h>
#define x 180
#define y 180


static HWND kaisi,teisi,jikan,kuria,setei;

HINSTANCE hinstance;
static TCHAR str[128],str2[128],str3[128];
HFONT myfont(int,DWORD,LPCTSTR);
static HFONT hfont;

LRESULT CALLBACK wndproc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) 
{
	HDC hdc;
	PAINTSTRUCT ps;
	RECT rect;
	SYSTEMTIME stime,stime2;
	static SCROLLINFO sc;
	static TCHAR scroll[64];

	switch(msg){
	case WM_CREATE:
		SetTimer(hwnd,1,300,NULL);
		hfont=myfont(20, SHIFTJIS_CHARSET, TEXT("MS ゴシック"));
		
	kaisi=CreateWindow(TEXT("BUTTON"),TEXT("開始"),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
				0,90,50,30,hwnd,(HMENU)100,hinstance,NULL);
	
	teisi=CreateWindow(TEXT("BUTTON"),TEXT("停止"),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_DISABLED,
				55,90,50,30,hwnd,(HMENU)101,hinstance,NULL);

	kuria=CreateWindow(TEXT("BUTTON"),TEXT("クリア"),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
				110,90,50,30,hwnd,(HMENU)103,hinstance,NULL);


	jikan=CreateWindow(TEXT("STATIC"),TEXT(""),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER,
				0,50,110,30,hwnd,(HMENU)102,hinstance,NULL);

	setei=CreateWindow(TEXT("SCROLLBAR"),TEXT(""),
				WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON | WS_BORDER| SBS_VERT ,
				110,50,30,30,hwnd,(HMENU)105,hinstance,NULL);

		sc.cbSize = sizeof(SCROLLINFO);
		sc.fMask = SIF_PAGE | SIF_RANGE;
		sc.nMin = 0;	sc.nMax = 100;
		sc.nPage = 10;

		SetScrollInfo(setei , SB_CTL , &sc , TRUE);
		sc.fMask = SIF_POS;
		break;
		case WM_HSCROLL:
		switch(LOWORD(wp)) {
		case SB_LEFT:
			sc.nPos = sc.nMin;
			break;
		case SB_RIGHT:
			sc.nPos = sc.nMax;
			break;
		case SB_LINELEFT:
			if (sc.nPos) sc.nPos--;
			break;
		case SB_LINERIGHT:
			if (sc.nPos < sc.nMax - 9) sc.nPos++;
			break;
		case SB_PAGELEFT:
			sc.nPos -= sc.nPage;
			break;
		case SB_PAGERIGHT:
			sc.nPos += sc.nPage;
			break;
		case SB_THUMBPOSITION:
			sc.nPos = HIWORD(wp);
			break;
		}
		SetScrollInfo(setei , SB_CTL , &sc , TRUE);
		wsprintf(scroll , TEXT("%d") , sc.nPos);
		SetWindowText(jikan , scroll);
		break;
	case WM_TIMER:
		GetLocalTime(&stime);
		SetLocalTime(&stime2);
		wsprintf(str,TEXT("%d時 %d分 %d秒"),
			stime.wHour,	stime.wMinute,	stime.wSecond);
		wsprintf(str2,TEXT("%d時 %d分 %d秒"),
			stime2.wHour,	stime2.wMinute,	stime2.wSecond);
		InvalidateRect(hwnd,NULL,TRUE);
		break;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		GetClientRect(hwnd , &rect);
		SelectObject(hdc,hfont);
		DrawText(hdc , str , -1, &rect , DT_LEFT);
		SetWindowText(jikan,str2);
		EndPaint(hwnd , &ps);
		break;
		case WM_COMMAND:
if(LOWORD(wp) == 100) {
			if(IsWindowEnabled(teisi)) EnableWindow(teisi , FALSE);
			else  EnableWindow(teisi , TRUE);EnableWindow(kaisi , FALSE);
		}
			if(LOWORD(wp) == 101){
			if(IsWindowEnabled(kaisi)) EnableWindow(kaisi , FALSE);
			else  EnableWindow(kaisi , TRUE);EnableWindow(teisi , FALSE);
		}
			if(LOWORD(wp) == 103){
			SetWindowText(jikan,TEXT("00時00分00秒"));
			InvalidateRect(hwnd,NULL,TRUE);
			break;
			}
		break;
	case WM_DESTROY:
		DeleteObject(hfont);
		PostQuitMessage(0);
		break;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

HFONT myfont(int nHeight, DWORD dwCharSet, LPCTSTR lpName)
{
	return(	CreateFont(nHeight, 0, 0, 0,
				FW_DONTCARE,
				FALSE, FALSE, FALSE,
				dwCharSet,
				OUT_DEFAULT_PRECIS,
				CLIP_DEFAULT_PRECIS,
				DEFAULT_QUALITY,
				DEFAULT_PITCH | FF_DONTCARE,
				lpName));
}


int WINAPI WinMain(HINSTANCE hinstance ,HINSTANCE hprevinstance , PSTR lpcmdline , int ncmdshow)
{
	HWND hwnd;
	MSG msg;
	WNDCLASS win;

	win.style			= CS_HREDRAW | CS_VREDRAW ;
	win.lpfnWndProc		= wndproc;
	win.cbClsExtra		=win.cbWndExtra	=0;
	win.hInstance		=hinstance;
	win.hIcon			=LoadIcon(NULL,IDI_APPLICATION);
	win.hCursor			=LoadCursor(NULL,IDC_ARROW);
	win.hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);
	win.lpszMenuName	=NULL;
	win.lpszClassName	=TEXT("練習");

	if(!RegisterClass(&win))	return -1;

	hwnd = CreateWindow(TEXT("練習"),TEXT("練習"),
					WS_VISIBLE |(WS_OVERLAPPEDWINDOW & ~(/*WS_MINIMIZEBOX|*/WS_MAXIMIZEBOX)),
					50,50,
					x,y,
					NULL,NULL,hinstance,NULL);

	if(hwnd == NULL)	return -1;

	while(GetMessage(&msg,NULL,0,0)){
		TranslateMessage( &msg );
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

へにっくす

Re: カウントダウンタイマー

#7

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

zero さんが書きました:SetLocalTime関数で時間を設定してやろうとしてもうまく表示されず(時間がでたらめな数字 5248時5428分5248秒になる)
・・・ねえ、わざとですかねえ。
初期化していないstime2を何で渡そうとしてるの(掲示されたソースではそのように見える)?
もの凄く気に入らないです。
それにSetLocalTime関数を使うには特権を取得する必要がありますよ。そのへんはMSDNの解説に載っています。
zero さんが書きました:スクロールバーコントロールで時間を00時00分00秒で▲マーククリックしても数字はかわらなくて困っています
そりゃ固定でTEXT("00時00分00秒")と書いてりゃねえ。
zero さんが書きました:新しく別のプログラムで横(水平)からの▲マークの方では0から増えていくのはできたのですが垂直だと増えませんでした。
えっと、、
水平スクロールバーの場合WM_HSCROLLメッセージが来ますが、垂直スクロールバーの場合、WM_VSCROLLがきます。
なぜそのような区別があるかというと、水平と垂直、両方とも表示するパターンがあるからです(たとえば複数行のエディットコントロールを作成する場合とかね)。
zero さんが書きました:スクロールバーコントロールのcase SB_LEFT: case SB_RIGHTをUPとDWONに変更すると定義されていませんってなって設定ができません。
UPとDOWNではなくTOPとBOTTOMです。
基本、矩形の左上の位置はLeft、Topであらわし、右下の位置はRight、Bottomであらわすと同様にスクロールバーの方向もそのように定義していますね。

・・・とまあ簡単ですがアドバイスになったかな?

zero

Re: カウントダウンタイマー

#8

投稿記事 by zero » 14年前

へりっくすさん、アドバイスありがとうございます。

一つ目

・・・ねえ、わざとですかねえ。
初期化していないstime2を何で渡そうとしてるの(掲示されたソースではそのように見える)?
もの凄く気に入らないです

わざとではありません。
単純に消したつもりでいましたので残ってるとは思ってませんでした。
プレビューでも確認したのですが見落としです。
不愉快にさせてしまいすみませんです。

二つ目

そりゃ固定でTEXT("00時00分00秒")と書いてりゃねえ。

上記の部分はあくまでクリアボタンを押された場合にTEXT("00時00分00秒")としています。


三つ目
スクロールバーコントロールTOPとBOTTOMなんですね。
ヒントありがとうございます。

時計のタイマーは00時00分00秒を使う場合に複数行のエディットコントロールを使わないとだめなんでしょうか?
一つのエディットコントロールでクリックした場所を増やせれないのでしょうか?

へにっくす

Re: カウントダウンタイマー

#9

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

zero さんが書きました:へりっくすさん、アドバイスありがとうございます。
・・・私は「へにっくす」です。人の名前を間違えないでください。(怒)
zero さんが書きました:一つ目
へにっくす さんが書きました: ・・・ねえ、わざとですかねえ。
初期化していないstime2を何で渡そうとしてるの(掲示されたソースではそのように見える)?
もの凄く気に入らないです
わざとではありません。
単純に消したつもりでいましたので残ってるとは思ってませんでした。
プレビューでも確認したのですが見落としです。
不愉快にさせてしまいすみませんです。
・・・じゃあSetLocalTime云々に関する質問は?、とか思うけどまあいいや。
zero さんが書きました:二つ目
へにっくす さんが書きました:そりゃ固定でTEXT("00時00分00秒")と書いてりゃねえ。
上記の部分はあくまでクリアボタンを押された場合にTEXT("00時00分00秒")としています。
うむ、確かにそうなっているね。そこは理解しているんだ。。
ところで、掲示したソースを実際に実行してみると、どこにも00時00分00秒とは出ないのだよ。明智君。
気になる点を挙げておこう。
SetWindowText関数を呼んだ後にわざわざInvalidateRect関数を呼んでいる理由は何だね?
また
WM_PAINTメッセージでわざわざSetWindowText関数を呼んでいる理由は?
普通は、
SetWindowText関数を呼んだ後にわざわざInvalidateRect関数を呼んだりしないし、
WM_PAINTメッセージでSetWindowText関数を呼ぶこともないよ。
WM_TIMERメッセージで現在の時刻を反映させているのはいいと思うんだけどね。
zero さんが書きました:三つ目
スクロールバーコントロールTOPとBOTTOMなんですね。
ヒントありがとうございます。
WM_HSCROLLとWM_VSCROLLの違いも理解してるよね?
zero さんが書きました:時計のタイマーは00時00分00秒を使う場合に複数行のエディットコントロールを使わないとだめなんでしょうか?
一つのエディットコントロールでクリックした場所を増やせれないのでしょうか?
ここがちょっと理解できませんが、、
どういう画面をイメージしてるんですかね?ちと簡単でいいので、図にしてみてくださいよ。
それを画像で添付してくれると、アドバイスしやすくなるんだけどな。

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

Re: カウントダウンタイマー

#10

投稿記事 by naohiro19 » 14年前

ソースコードをCtrl+Aで全選択した後に、編集→詳細→指定範囲のフォーマット をするとインデントをそろえることができます。
最後に編集したユーザー naohiro19 on 2012年6月17日(日) 00:00 [ 編集 1 回目 ]

zero
記事: 1
登録日時: 14年前

Re: カウントダウンタイマー

#11

投稿記事 by zero » 14年前

名前間違えてすみません。へにっくすさん

ところで、掲示したソースを実際に実行してみると、どこにも00時00分00秒とは出ないのだよ。明智君。

jikan=CreateWindow(TEXT("STATIC"),TEXT("")のところで最初は00時00分00秒と表示させていたのですが

入力できる状態の時(元 jikan=CreateWindow(TEXT("EDIT),TEXT(""))、入力すると00時00分00秒が消えてしまうため今は何も表示させていません。

SetWindowText関数を呼んだ後にわざわざInvalidateRect関数を呼んでいる理由は

InvalidateRect関数をやった方いいのかなっと思いInvalidateRect関数を呼んでいるだけです。

3週間~1ヵ月くらいしかwin32apiやってないのでそこまで理解できていません

WM_PAINTメッセージでわざわざSetWindowText関数を呼んでいる理由は?

WM_PAINTメッセージでわざわざSetWindowText関数を呼んでいるはSetLocalTime関数で使うために呼んでる

でも、SetLocalTime関数を使って表示させたのはいいがちゃんと表示されず放置していました。

レスの時に消したつもりでいたので残ってるとは思いませんでした。

画面イメージは下記の図見たいな感じで▲▼一つだけで00:00:00の部分を設定できるようになったらいいなぁって思っています。
添付ファイル
12.jpg
12.jpg (20.8 KiB) 閲覧数: 5727 回

へにっくす

Re: カウントダウンタイマー

#12

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

zero さんが書きました:InvalidateRect関数をやった方いいのかなっと思いInvalidateRect関数を呼んでいるだけです。
3週間~1ヵ月くらいしかwin32apiやってないのでそこまで理解できていません
正直でよろしい。
InvalidateRect関数は、自前で描画しているクライアントの領域に対して行うもので、コントロールに対して行うものではありません。
エディットコントロールに対してSetWindowTextすると、InvalidateRect関数を呼ばなくてもちゃんと表示されてましたよね?
また、WM_PAINTメッセージは、自分のウィンドウのクライアント領域を描画するためのメッセージであって、子ウィンドウ(コントロール)の設定をする(SetWindowTextなどの関数を呼ぶ)箇所ではありません。
zero さんが書きました:でも、SetLocalTime関数を使って表示させたのはいいがちゃんと表示されず放置していました。
レスの時に消したつもりでいたので残ってるとは思いませんでした。
消したつもりでも、送信する前に必ず一度は確認してください。何のためにプレビューボタンがあると思ってるんですか。。
zero さんが書きました:画面イメージは下記の図見たいな感じで▲▼一つだけで00:00:00の部分を設定できるようになったらいいなぁって思っています。
自分で作成する必要がないなら、すでに拡張のコントロールであります。
猫でもわかるプログラミング
Windows SDK編 第2部 第178章 日付・時刻の入力
をみると幸せになれるかもしれませんねえ。。
これを使えば複数のコントロールを作る必要がありません。
ちょっと敷居が高い(プロジェクトの設定が必要)かもしれませんが、貴方ならできる!
(Win32API関数をほぼ網羅しているので上記のページを読み進めた方が分かりやすいと思いますよ)

閉鎖

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