Errors_w.cpp
[目次 | 関数]
1|/***************************************************************************
2| 1. <<< テスト&デバッグツール for Windows (errors) >>>
3|****************************************************************************/
4|
5|//#include <stdafx.h> /* インクルードパスを Visual Studio のプロジェクトファイルのあるフォルダに通してください */
6|#include "mixer_precomp.h"
7|
8|#ifdef USES_MXP_AUTOINC
9| #include <errors.ah>
10|#endif
11|
12|
13|/*--------------------------------------------------------------------*/
14|/* 2. <<<<◆ デバッグツール >>>> */
15|/*--------------------------------------------------------------------*/
16|
17|int Errors_poolCount = 0;
18|
19|
20|#if defined(FOR_WIN32)
21|
22|
23|/**************************************************************************
24| 2-1. <<< [Errors_startPool_release] ウィンドウ出力をため始める >>>
25|【例】
26| Errors_startPool();
27| Errors_printf( "a" ); // ここでは、表示しない
28| Errors_printf( "b" );
29| Errors_endPool(); // ここで、"a", "b" を両方同時に表示する
30|***************************************************************************/
31|void Errors_startPool_release()
32|{
33| #if !defined(ERRORS_PRINTF_TO_MEMORY) || !defined(ERRORS_ERR_PRINTF_TO_MEMORY)
34| error2_0( Errors_Unofficial, "ERRORS_PRINTF_TO_MEMORY オプションと"
35| " ERRORS_ERR_PRINTF_TO_MEMORY が必要です。" );
36| #endif
37|
38| if ( Errors_poolStart == NULL )
39| Errors_poolStart = Errors_log_p;
40|
41| Errors_poolCount ++;
42|}
43|
44|
45|/**************************************************************************
46| 2-2. <<< [Errors_endPool_release] ためたウィンドウ出力を表示する >>>
47|【補足】
48|・ネストした場合、最も外側の Errors_endPool を呼び出したときのみウィンドウを
49| 表示します。
50|・Endeavor(Win2000,VC++6?) でコンパイルした場合、メインウィンドウが閉じる
51| 前に(OnOK の最後などで)呼び出してください。それに伴い、アプリケーションの
52| 後始末や Errors_chkDefault をメインウィンドウが閉じる前に実行してください。
53| なぜなら、CWinApp::m_pMainWnd を設定した後で、メインウィンドウが無いと、
54| m_CDialog::CreateIndirect の内部でハングアップするためです。
55|***************************************************************************/
56|void Errors_endPool_release()
57|{
58| char* p;
59| char res[ sizeof(DLGTEMPLATE) + 34 + 3 +
60| ( sizeof(DLGITEMTEMPLATE) + 8 + 3 ) * 2 + 8 ]; /* ダイアログ・リソース */
61| char msg[ Errors_log_size * sizeof(WCHAR) ]; /* 表示するメッセージ */
62|
63| if ( Errors_poolCount <= 0 ) {
64| ERRORS_WARNING_0( "Errors_endPool が多すぎるか startPool していない" );
65| return;
66| }
67| Errors_poolCount --;
68|
69| /* メッセージがたまっていなかったら、表示しない */
70| if ( Errors_poolCount > 0 || Errors_log_p == Errors_poolStart ||
71| Errors_poolStart == NULL ) return;
72|
73| /* メモリ res 上にダイアログ・リソースを作成する */
74| {
75| memset( res, 0, sizeof(res) );
76|
77| /* ダイアログ */
78| p = res;
79| {
80| DLGTEMPLATE* t = (DLGTEMPLATE*)p;
81| t->style = ( WS_CAPTION | WS_DLGFRAME | WS_POPUP | DS_MODALFRAME | DS_SETFONT | DS_CENTER );
82| t->x = 0;
83| t->y = 0;
84| t->cx = 300;
85| t->cy = 127;
86| t->dwExtendedStyle = 0;
87| t->cdit = 2;
88| p += sizeof( DLGTEMPLATE );
89| }
90| *(WORD*)p = 0; p += sizeof(WORD); /* menu */
91| *(WORD*)p = 0; p += sizeof(WORD); /* winClass */
92| wcscpy( (WCHAR*)p, L"エラーの詳細" ); p += 14; /* caption */
93| *(WORD*)p = 10; p += sizeof(WORD); /* fontSize */
94| wcscpy( (WCHAR*)p, L"MS P明朝" ); p += 14; /* fontName */
95|
96| /* エディットボックス */
97| p = (char*)( (int)(p + 3) & ~0x3 );
98| {
99| DLGITEMTEMPLATE* t = (DLGITEMTEMPLATE*)p;
100| t->id = 0x1081;
101| t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_MULTILINE | ES_LEFT |
102| WS_BORDER | WS_HSCROLL | WS_VSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL |
103| ES_NOHIDESEL | ES_WANTRETURN | ES_READONLY );
104| t->x = 3;
105| t->y = 3;
106| t->cx = 294;
107| t->cy = 100;
108| t->dwExtendedStyle = 0;
109| p += sizeof( DLGTEMPLATE );
110| }
111| *(WORD*)p = 0xFFFF; p += sizeof(WORD); /* atom */
112| *(WORD*)p = 0x0081; p += sizeof(WORD); /* Edit */
113| *(WORD*)p = 0x0000; p += sizeof(WORD); /* caption */
114| *(WORD*)p = 0; p += sizeof(WORD); /* nCtrlByte */
115|
116| /* ボタン */
117| p = (char*)( (int)(p + 3) & ~0x3 );
118| {
119| DLGITEMTEMPLATE* t = (DLGITEMTEMPLATE*)p;
120| t->id = 0x1;
121| t->style = ( WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON );
122| t->x = 134;
123| t->y = 109;
124| t->cx = 40;
125| t->cy = 12;
126| t->dwExtendedStyle = 0;
127| p += sizeof( DLGTEMPLATE );
128| }
129| *(WORD*)p = 0xFFFF; p += sizeof(WORD); /* atom */
130| *(WORD*)p = 0x0080; p += sizeof(WORD); /* Button */
131| wcscpy( (WCHAR*)p, L"&OK" ); p += 4 * sizeof(WCHAR); /* caption */
132| *(WORD*)p = 0; p += sizeof(WORD); /* nCtrlByte */
133| }
134|
135| /* 表示するメッセージを作成する */
136| {
137| p = msg;
138| if ( Errors_log_p < Errors_poolStart ) {
139| strcpy( p, Errors_poolStart );
140| p = strchr( p, '\0' ) + 1;
141| Errors_poolStart = Errors_log;
142| }
143| strncpy( p, Errors_poolStart, Errors_log_p - Errors_poolStart );
144| p += Errors_log_p - Errors_poolStart;
145| *p = '\0';
146| }
147|
148| /* ウィンドウにメッセージを表示する */
149| {
150| CDialog dlg;
151| HWND w;
152|
153| dlg.CreateIndirect( (DLGTEMPLATE*)res,
154| ( Errors_parentCWnd == NULL ? NULL : (CWnd*)Errors_parentCWnd ) );
155| w = GetDlgItem( dlg.m_hWnd, 0x1081 ); SetWindowText( w, msg );
156| w = GetDlgItem( dlg.m_hWnd, 0x1 ); SetFocus( w );
157| dlg.ShowWindow( SW_SHOW );
158| dlg.RunModalLoop(0);
159| dlg.EndDialog( 0 );
160| dlg.DestroyWindow();
161| }
162|
163| /* ためていたメッセージをクリアする */
164| Errors_poolStart = NULL;
165|}
166|
167|
168|
169|
170|/**************************************************************************
171| 2-3. <<< [Errors_endAllPool_release] ためたウィンドウ出力を表示する >>>
172|【補足】
173|・ネストしている場合でも、表示して、ネストをなくします。
174|***************************************************************************/
175|void Errors_endAllPool_release()
176|{
177| do {
178| Errors_endPool_release();
179| } while ( Errors_poolCount > 0 );
180|}
181|
182|
183|
184|
185|/**************************************************************************
186| 2-4. <<< [Errors_clearPool_release] ためたウィンドウ出力を表示しないでクリアする >>>
187|***************************************************************************/
188|void Errors_clearPool_release()
189|{
190|#if 0
191| Errors_poolCount = 0;
192| Errors_poolStart = NULL;
193|#else
194| ASSERT( Errors_poolCount > 0 );
195| Errors_poolCount --;
196|
197| if ( Errors_poolCount == 0 )
198| Errors_poolStart = NULL;
199|#endif
200|}
201|
202|
203|#endif /* #if defined(ERRORS_PRINTF_TO_WINDOW) && defined(FOR_WIN32) */
204|
205|