source: dev/trunk/ab5.0/abdev/ProjectEditor/ParameterHint.cpp@ 475

Last change on this file since 475 was 475, checked in by dai_9181, 16 years ago

構成管理を変更中・・・(いったんコミット)

File size: 34.1 KB
Line 
1#include "stdafx.h"
2
3#include "common.h"
4
5void ShowCommandMessage(void);
6
7BOOL CheckGrammar(char *buffer){
8 int i,IsStr,PareNum;
9
10 for(i=0,IsStr=0,PareNum=0;;i++){
11 if(buffer[i]=='\"') IsStr^=1;
12 else if(buffer[i]=='(') PareNum++;
13 else if(buffer[i]==')') PareNum--;
14 else if(buffer[i]=='\0'||(buffer[i]=='\r'&&buffer[i+1]=='\n')){
15 if(IsStr||PareNum) return 0;
16 if(buffer[i]=='\0') break;
17 i++;
18 continue;
19 }
20 else if(buffer[i]=='\''&&IsStr==0){
21 while(!(buffer[i]=='\0'||(buffer[i]=='\r'&&buffer[i+1]=='\n'))) i++;
22 i--;
23 continue;
24 }
25 }
26 return 1;
27}
28
29char *GetUserSourceCode(void){
30 //単体ファイルのときはそのファイルを、プロジェクトのときはpjname.abの内容を取得
31 extern HANDLE hHeap;
32 extern PROJECTINFO ProjectInfo;
33 int i;
34 char temporary[MAX_PATH],*pBuf;
35
36 if(ProjectInfo.name[0]){
37 //プロジェクトが開かれているとき
38 lstrcpy(temporary,ProjectInfo.pobj_DBFileInfo->ppobj_FileInfo[0]->m_path);
39 GetFullPath(temporary,ProjectInfo.dir);
40
41 extern MDIINFO MdiInfo[MAX_WNDNUM];
42 for(i=0;i<MAX_WNDNUM;i++){
43 if(MdiInfo[i].hwnd){
44 if(lstrcmpi(MdiInfo[i].path,temporary)==0) break;
45 }
46 }
47 if(i==MAX_WNDNUM){
48 //ファイルから開く
49 pBuf=ReadBuffer(temporary);
50 }
51 else{
52 //エディタから読み込む
53 pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[i].pMdiTextEdit->buffer)+1);
54 lstrcpy(pBuf,MdiInfo[i].pMdiTextEdit->buffer);
55 }
56 }
57 else{
58 //単体ソースコードのとき
59 extern MDIINFO MdiInfo[MAX_WNDNUM];
60 int WndNum;
61
62 WndNum=GetWndNum(GetWindow(hClient,GW_CHILD));
63
64 pBuf=(char *)HeapAlloc(hHeap,0,lstrlen(MdiInfo[WndNum].pMdiTextEdit->buffer)+1);
65 lstrcpy(pBuf,MdiInfo[WndNum].pMdiTextEdit->buffer);
66 }
67
68 //ファイルをインクルード
69 pBuf=IncludeFiles(pBuf);
70
71 return pBuf;
72}
73
74BOOL SetCommandMessageToMethodCheck(char *Command){
75 extern METHODCHECKINFO MethodCheckInfo;
76 int CmdValue;
77
78 CmdValue=IsBasicReservedWord(Command);
79 if(CmdValue==COM_ABSTRACT) lstrcpy(MethodCheckInfo.msg,"Abstract Sub/Function ([arglist]) [As type]]");
80 else if(CmdValue==COM_BEEP) lstrcpy(MethodCheckInfo.msg,"Beep");
81 else if(CmdValue==COM_CHDIR) lstrcpy(MethodCheckInfo.msg,"ChDir directory$");
82 else if(CmdValue==COM_CIRCLE) lstrcpy(MethodCheckInfo.msg,"Circle (x, y), radius, [color], [start], [end], [aspect], [f], [brushcolor]");
83 else if(CmdValue==COM_CLOSE) lstrcpy(MethodCheckInfo.msg,"Close [filenumber]");
84 else if(CmdValue==COM_CLASS) lstrcpy(MethodCheckInfo.msg,"Class name");
85 else if(CmdValue==COM_CLS) lstrcpy(MethodCheckInfo.msg,"Cls [number]");
86 else if(CmdValue==COM_COLOR) lstrcpy(MethodCheckInfo.msg,"Color color, [backcolor]");
87 else if(CmdValue==COM_CONST) lstrcpy(MethodCheckInfo.msg,"Const constname = expression");
88 else if(CmdValue==COM_DEBUG) lstrcpy(MethodCheckInfo.msg,"Debug");
89 else if(CmdValue==COM_DECLARE) lstrcpy(MethodCheckInfo.msg,"Declare Sub/Function name Lib \"libname\" [Alias \"aliasname\"] ([arglist]) [As type]]");
90 else if(CmdValue==COM_DEF) lstrcpy(MethodCheckInfo.msg,"Def func([parms] [,parms2])=expression");
91 else if(CmdValue==COM_DIM) lstrcpy(MethodCheckInfo.msg,"Dim variable [(subscripts)] As type, ...");
92 else if(CmdValue==COM_END) lstrcpy(MethodCheckInfo.msg,"End [type]");
93 else if(CmdValue==COM_ENUM) lstrcpy(MethodCheckInfo.msg,"Enum name");
94 else if(CmdValue==COM_FIELD) lstrcpy(MethodCheckInfo.msg,"Field #filenumber, fieldbyte");
95 else if(CmdValue==COM_FOR) lstrcpy(MethodCheckInfo.msg,"For variable=start To end [Step step]");
96 else if(CmdValue==COM_FUNCTION) lstrcpy(MethodCheckInfo.msg,"Function name ([arglist]) [As type]");
97 else if(CmdValue==COM_GET) lstrcpy(MethodCheckInfo.msg,"Get #filenumber, recode, StrBuffer");
98 else if(CmdValue==COM_GOSUB) lstrcpy(MethodCheckInfo.msg,"GoSub label");
99 else if(CmdValue==COM_GOTO) lstrcpy(MethodCheckInfo.msg,"Goto label");
100 else if(CmdValue==COM_IF) lstrcpy(MethodCheckInfo.msg,"If judgment Then truecommand [Else falsecommand]");
101 else if(CmdValue==COM_INHERITS) lstrcpy(MethodCheckInfo.msg,"Inherits BaseClass");
102 else if(CmdValue==COM_INPUT) lstrcpy(MethodCheckInfo.msg,"Input [# filenumber, ] variable, [...]");
103 else if(CmdValue==COM_INTERFACE) lstrcpy(MethodCheckInfo.msg,"Interface name");
104 else if(CmdValue==COM_KILL) lstrcpy(MethodCheckInfo.msg,"Kill filename$");
105 else if(CmdValue==COM_LET) lstrcpy(MethodCheckInfo.msg,"[Let] variable = expression");
106 else if(CmdValue==COM_LINE) lstrcpy(MethodCheckInfo.msg,"Line [(sx, sy)] -[Step] (ex, ey), [color], [B/Bf], [color2]");
107 else if(CmdValue==COM_LOCATE) lstrcpy(MethodCheckInfo.msg,"Locate x, y");
108 else if(CmdValue==COM_LOOP) lstrcpy(MethodCheckInfo.msg,"Loop while/until judgment");
109 else if(CmdValue==COM_MKDIR) lstrcpy(MethodCheckInfo.msg,"MkDir directory$");
110 else if(CmdValue==COM_MSGBOX) lstrcpy(MethodCheckInfo.msg,"MsgBox hWnd, String$, [Title$], [BoxType], [retAns]");
111 else if(CmdValue==COM_NAMESPACE) lstrcpy(MethodCheckInfo.msg,"Namespace namespaceStr");
112 else if(CmdValue==COM_NEXT) lstrcpy(MethodCheckInfo.msg,"Next");
113 else if(CmdValue==COM_OPEN) lstrcpy(MethodCheckInfo.msg,"Open filename$ [For Input/Output/Append] As number");
114 else if(CmdValue==COM_PAINT) lstrcpy(MethodCheckInfo.msg,"Paint (x, y), brushcolor, [linecolor]");
115 else if(CmdValue==COM_PRINT) lstrcpy(MethodCheckInfo.msg,"Print outdata, [...]");
116 else if(CmdValue==COM_PRIVATE) lstrcpy(MethodCheckInfo.msg,"Private");
117 else if(CmdValue==COM_PROTECTED) lstrcpy(MethodCheckInfo.msg,"Protected");
118 else if(CmdValue==COM_PSET) lstrcpy(MethodCheckInfo.msg,"PSet (x, y), [color]");
119 else if(CmdValue==COM_PUBLIC) lstrcpy(MethodCheckInfo.msg,"Public");
120 else if(CmdValue==COM_PUT) lstrcpy(MethodCheckInfo.msg,"Put #filenumber, recode, StrBuffer");
121 else if(CmdValue==COM_RANDOMIZE) lstrcpy(MethodCheckInfo.msg,"Randomize [number]");
122 else if(CmdValue==COM_REM) lstrcpy(MethodCheckInfo.msg,"Rem [comment]");
123 else if(CmdValue==COM_RETURN) lstrcpy(MethodCheckInfo.msg,"Return");
124 else if(CmdValue==COM_SELECT) lstrcpy(MethodCheckInfo.msg,"Select Case testexpression");
125 else if(CmdValue==COM_SUB) lstrcpy(MethodCheckInfo.msg,"Sub name ([arglist])");
126 else if(CmdValue==COM_TYPE) lstrcpy(MethodCheckInfo.msg,"Type name");
127 else if(CmdValue==COM_TYPEDEF) lstrcpy(MethodCheckInfo.msg,"TypeDef newtype = basetype");
128 else if(CmdValue==COM_VIRTUAL) lstrcpy(MethodCheckInfo.msg,"Virtual Sub/Function ([arglist]) [As type]]");
129 else if(CmdValue==COM_OVERRIDE) lstrcpy(MethodCheckInfo.msg,"Override Sub/Function ([arglist]) [As type]]");
130 else if(CmdValue==COM_WEND) lstrcpy(MethodCheckInfo.msg,"Wend");
131 else if(CmdValue==COM_WHILE) lstrcpy(MethodCheckInfo.msg,"While judgment");
132 else if(CmdValue==COM_WINDOW) lstrcpy(MethodCheckInfo.msg,"Window hWnd, OwnerWnd, x, y, width, height, title$, style, [class$], [ID], [callbackfunction], [ExStyle]");
133 else if(CmdValue==COM_WITH) lstrcpy(MethodCheckInfo.msg,"With object");
134 else if(CmdValue==COM_WRITE) lstrcpy(MethodCheckInfo.msg,"Write [data, ...]");
135 else return 0;
136 return 1;
137}
138
139void ChangeReturnCode(char *buffer){
140 //改行コードのCRLFをLFに変換
141 int i,i2;
142 for(i=0,i2=0;;i++,i2++){
143 if(buffer[i]=='\r'&&buffer[i+1]=='\n') i++;
144 buffer[i2]=buffer[i];
145 if(buffer[i]=='\0') break;
146 }
147}
148void DeleteComment(char *buffer){ //注釈「'」の取り除き
149 int i,i2,i3,IsStr;
150 char *temporary;
151 temporary=(char *)GlobalAlloc(GMEM_FIXED,lstrlen(buffer)+1);
152 for(i=0,i2=0,i3=0,IsStr=0;;i++,i2++){
153 if(buffer[i]=='\"') IsStr^=1;
154 if(buffer[i]=='\n'||buffer[i]=='\0'){
155 i2--;
156 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
157 i2++;
158
159 if(i3){
160 //複数行に渡る注釈文の中に改行が存在するとき
161 memset(temporary+i2,'\n',i3);
162 i2+=i3;
163 i3=0;
164 }
165 }
166 if(buffer[i]=='\''&&IsStr==0){
167 //注釈文
168 i2--;
169 while(temporary[i2]==' '||temporary[i2]=='\t') i2--;
170 i2++;
171 while(buffer[i]!='\n'&&buffer[i]!='\0') i++;
172 }
173 if(buffer[i]=='/'&&buffer[i+1]=='*'&&IsStr==0){
174 //注釈文(複数行)
175 i+=2;
176 i3=0;
177 while(!(buffer[i]=='*'&&buffer[i+1]=='/')){
178 if(buffer[i]=='\n') i3++;
179 if(buffer[i]=='\0') break;
180 i++;
181 }
182 if(buffer[i]){
183 i+=2;
184 }
185 i--;
186 i2--;
187 continue;
188 }
189 temporary[i2]=buffer[i];
190 if(buffer[i]=='\0') break;
191 }
192 lstrcpy(buffer,temporary);
193 GlobalFree(temporary);
194}
195
196BOOL GetDefualtFunctionParameter(char *pBuf,char *FuncName,char *Parameter){
197 int i,i2;
198 char temporary[VN_SIZE];
199
200 /////////////////////////////////////////
201 // ソースコードから関数定義位置を取得
202 /////////////////////////////////////////
203
204 for(i=0;;i++){
205 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
206
207 if(memicmp(pBuf+i,"Class",5)==0&&(pBuf[i+5]==' '||pBuf[i+5]=='\t')||
208 memicmp(pBuf+i,"Interface",9)==0&&(pBuf[i+9]==' '||pBuf[i+9]=='\t')||
209 memicmp(pBuf+i,"Type",4)==0&&(pBuf[i+4]==' '||pBuf[i+4]=='\t')){
210 /* Class ~ End Class
211 Interface ~ End Interface
212 Type ~ End Type
213 は飛び越す */
214
215 while(1){
216 if(pBuf[i]=='\0'){
217 i2=0;
218 break;
219 }
220
221 if(memicmp(pBuf+i,"End",3)==0){
222 /* End Class
223 End Interface
224 End Type
225 の検出 */
226 i+=3;
227 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
228
229 if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
230 memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
231 memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
232 i2=0;
233 break;
234 }
235 }
236
237 //次の行をサーチ
238 for(;;i++){
239 if(pBuf[i]=='\0') break;
240 i2=IsCommandDelimitation(pBuf,i);
241 if(i2){
242 i+=i2;
243 break;
244 }
245 }
246 JumpBlank(pBuf,&i);
247 }
248 }
249
250 if(memicmp(pBuf+i,"Declare",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')){
251 i+=8;
252 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
253
254 if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
255 else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
256 else goto NextCommand;
257
258 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
259
260 for(i2=0;;i++,i2++){
261 if(!IsVariableChar(pBuf[i])){
262 temporary[i2]=0;
263 break;
264 }
265 temporary[i2]=pBuf[i];
266 }
267 if(lstrcmp(temporary,FuncName)==0){
268 //関数名が一致したとき
269 break;
270 }
271 }
272 if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
273 memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
274 if(pBuf[i]=='f'||pBuf[i]=='F') i+=9;
275 else i+=4;
276
277 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
278 for(i2=0;;i++,i2++){
279 if(!IsVariableChar(pBuf[i])){
280 temporary[i2]=0;
281 break;
282 }
283 temporary[i2]=pBuf[i];
284 }
285 if(lstrcmpi(temporary,"Export")==0){
286 //"Export"を飛び越す
287 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
288 for(i2=0;;i++,i2++){
289 if(!IsVariableChar(pBuf[i])){
290 temporary[i2]=0;
291 break;
292 }
293 temporary[i2]=pBuf[i];
294 }
295 }
296 if(lstrcmp(temporary,FuncName)==0){
297 //関数名が一致したとき
298 break;
299 }
300
301 }
302
303NextCommand:
304 for(;;i++){
305 i2=IsCommandDelimitation(pBuf,i);
306 if(i2){
307 if(i2==2) i++;
308 break;
309 }
310 }
311
312 if(pBuf[i]=='\0') return 0;
313 }
314
315 for(;;i++){
316 if(pBuf[i]=='(') break;
317 if(IsCommandDelimitation(pBuf,i)) return 0;
318 }
319
320 //関数名をコピー
321 lstrcpy(Parameter,FuncName);
322 i2=lstrlen(Parameter);
323
324
325 //////////////////////////////////////////////////////
326 //パラメータをコピー
327 //(コメントの挿入、途中改行などの状況を考慮する)
328 //////////////////////////////////////////////////////
329
330 for(;;i++,i2++){
331 if(IsVariableChar(pBuf[i-1])==0&&pBuf[i-1]!=')'&&IS_BLANK(pBuf[i])||
332 pBuf[i]=='\''||
333 pBuf[i]=='/'&&pBuf[i+1]=='*')
334 JumpBlank(pBuf,&i);
335
336 if(IsCommandDelimitation(pBuf,i)){
337 if(IS_RETURN(pBuf,i)&&
338 pBuf[i-1]=='_'||pBuf[i-1]=='('||pBuf[i-1]==','){
339 //改行を許可
340 i2--;
341 if(Parameter[i2]=='_') i2--;
342
343 i+=2;
344 continue;
345 }
346
347 Parameter[i2]=0;
348 break;
349 }
350 Parameter[i2]=pBuf[i];
351 }
352
353
354 //文法チェック
355 if(!CheckGrammar(Parameter)) return 0;
356
357
358 return 1;
359}
360BOOL GetClassMemberFunctionParameter(char *pBuf,char *ClassName,char *nest,char *Parameter){
361 extern HANDLE hHeap;
362 extern char *pHeaderBuf;
363 extern char *pUserSource;
364 int i,i2;
365 char temporary[8192];
366 DWORD dwClassType;
367 BOOL bRet;
368
369
370 /////////////////////////////////////////
371 // ソースコードからクラス定義位置を取得
372 /////////////////////////////////////////
373 i=GetClassPos(pBuf,ClassName,&dwClassType);
374 if(pBuf[i]=='\0') return 0;
375
376 //クラス、配列の構成要素を解析する
377 char VarName[VN_SIZE]; //変数名
378 char array[VN_SIZE]; //第1次配列
379 char lpPtrOffset[VN_SIZE]; //第2次配列
380 char NestMember[VN_SIZE]; //入れ子メンバ
381 int RefType; //"."参照のときは0、"->"参照のときは1
382 lstrcpy(VarName,nest);
383 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
384
385 if(RefType){
386 ////////////////////
387 // 入れ子構造の場合
388 ////////////////////
389
390 //メンバ変数の型であるクラスの名前を取得
391 char ClassName[VN_SIZE];
392 BOOL bArray;
393 if(!GetClassNameFromClassMember(pBuf,i,VarName,ClassName,&bArray)) return 0;
394
395 //TypeDef宣言を考慮してオリジナルなクラス名を取得
396 GetOriginalClassName(ClassName);
397
398 if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
399
400 //ユーザーのソースコードをサーチ
401 bRet=GetClassMemberFunctionParameter(pUserSource,ClassName,NestMember,Parameter);
402 if(!bRet){
403 //失敗したときはbasic.sbpをサーチ
404 bRet=GetClassMemberFunctionParameter(pHeaderBuf,ClassName,NestMember,Parameter);
405 }
406 return bRet;
407 }
408
409
410 ////////////////////////
411 // メンバ情報を取得
412 ////////////////////////
413 DWORD dwProc;
414
415 if(memicmp(pBuf+i,"Inherits",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
416 i+=9;
417 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
418
419 ////////////////////////
420 // 継承先クラスをサーチ
421 ////////////////////////
422
423 for(i2=0;;i++,i2++){
424 if(!IsVariableChar(pBuf[i])){
425 temporary[i2]=0;
426 break;
427 }
428 temporary[i2]=pBuf[i];
429 }
430
431 //ユーザーのソースコードをサーチ
432 bRet=GetClassMemberFunctionParameter(pUserSource,temporary,nest,Parameter);
433 if(!bRet){
434 //失敗したときはbasic.sbpをサーチ
435 bRet=GetClassMemberFunctionParameter(pHeaderBuf,temporary,nest,Parameter);
436 }
437 if(bRet) return 1;
438 }
439
440 //メンバ変数、関数を取得
441 while(1){
442 if(pBuf[i]=='\0') break;
443 if(memicmp(pBuf+i,"End",3)==0){
444 /* End Class
445 End Interface
446 End Type
447 の検出 */
448 i2=i+3;
449 while(pBuf[i2]==' '||pBuf[i2]=='\t') i2++;
450
451 if(memicmp(pBuf+i2,"Class",5)==0&&(!IsVariableChar(pBuf[i2+5]))||
452 memicmp(pBuf+i2,"Interface",9)==0&&(!IsVariableChar(pBuf[i2+9]))||
453 memicmp(pBuf+i2,"Type",4)==0&&(!IsVariableChar(pBuf[i2+4]))) break;
454 }
455
456 if(memicmp(pBuf+i,"Abstract",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
457 memicmp(pBuf+i,"Virtual",7)==0&&(pBuf[i+7]==' '||pBuf[i+7]=='\t')||
458 memicmp(pBuf+i,"Override",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
459 memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')||
460 memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
461 //メンバ関数のとき
462 if(pBuf[i]=='a'||pBuf[i]=='A'){
463 i+=9;
464 dwProc=ESC_ABSTRACT;
465
466 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
467 if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')) i+=9;
468 else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')) i+=4;
469 }
470 else if(pBuf[i]=='v'||pBuf[i]=='V'){
471 i+=8;
472
473 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
474 if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
475 i+=9;
476 dwProc=ESC_FUNCTION;
477 }
478 else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
479 i+=4;
480 dwProc=ESC_SUB;
481 }
482 }
483 else if(pBuf[i]=='o'||pBuf[i]=='O'){
484 i+=9;
485
486 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
487 if(memicmp(pBuf+i,"Function",8)==0&&(pBuf[i+8]==' '||pBuf[i+8]=='\t')){
488 i+=9;
489 dwProc=ESC_FUNCTION;
490 }
491 else if(memicmp(pBuf+i,"Sub",3)==0&&(pBuf[i+3]==' '||pBuf[i+3]=='\t')){
492 i+=4;
493 dwProc=ESC_SUB;
494 }
495 }
496 else if(pBuf[i]=='f'||pBuf[i]=='F'){
497 i+=9;
498 dwProc=ESC_FUNCTION;
499 }
500 else if(pBuf[i]=='s'||pBuf[i]=='S'){
501 i+=4;
502 dwProc=ESC_SUB;
503 }
504
505 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
506 }
507 else{
508 //メンバ変数のとき
509 dwProc=0;
510 }
511
512 if(dwProc){
513 //変数名または関数名を取得
514 for(i2=0;;i++,i2++){
515 if(!IsVariableChar(pBuf[i])){
516 temporary[i2]=0;
517 break;
518 }
519 temporary[i2]=pBuf[i];
520 }
521
522 if(lstrcmp(temporary,nest)==0){
523 //ターゲットとなるメンバ関数が見つかったとき
524 for(;;i++){
525 if(pBuf[i]=='(') break;
526 if(IsCommandDelimitation(pBuf,i)) return 0;
527 }
528
529 lstrcpy(Parameter,nest);
530 i2=lstrlen(Parameter);
531 for(;;i++,i2++){
532 if(IsCommandDelimitation(pBuf,i)){
533 Parameter[i2]=0;
534 break;
535 }
536 Parameter[i2]=pBuf[i];
537 }
538
539 if(!CheckGrammar(Parameter)) return 0;
540
541 return 1;
542 }
543 }
544
545 //次の行をサーチ
546 for(;;i++){
547 if(pBuf[i]=='\0') break;
548 i2=IsCommandDelimitation(pBuf,i);
549 if(i2){
550 i+=i2;
551 break;
552 }
553 }
554 JumpBlank(pBuf,&i);
555
556 if((dwProc==ESC_SUB||dwProc==ESC_FUNCTION)&&dwClassType!=ESC_INTERFACE){
557 //End Sub、End Functionまでジャンプする
558
559 while(1){
560 if(pBuf[i]=='\0'){
561 i2=0;
562 break;
563 }
564
565 if(memicmp(pBuf+i,"End",3)==0){
566 /* End Sub
567 End Function
568 の検出 */
569 i+=3;
570 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
571
572 if(memicmp(pBuf+i,"Sub",3)==0&&(!IsVariableChar(pBuf[i+3]))||
573 memicmp(pBuf+i,"Function",8)==0&&(!IsVariableChar(pBuf[i+8]))){
574 i2=1;
575 break;
576 }
577
578 if(memicmp(pBuf+i,"Class",5)==0&&(!IsVariableChar(pBuf[i+5]))||
579 memicmp(pBuf+i,"Interface",9)==0&&(!IsVariableChar(pBuf[i+9]))||
580 memicmp(pBuf+i,"Type",4)==0&&(!IsVariableChar(pBuf[i+4]))){
581 i2=0;
582 break;
583 }
584 }
585
586 //次の行をサーチ
587 for(;;i++){
588 if(pBuf[i]=='\0') break;
589 i2=IsCommandDelimitation(pBuf,i);
590 if(i2){
591 i+=i2;
592 break;
593 }
594 }
595 JumpBlank(pBuf,&i);
596 }
597
598 if(i2==0){
599 //コード解析が不正に終了
600 return 1;
601 }
602
603 //次の行をサーチ
604 for(;;i++){
605 if(pBuf[i]=='\0') break;
606 i2=IsCommandDelimitation(pBuf,i);
607 if(i2){
608 i+=i2;
609 break;
610 }
611 }
612 JumpBlank(pBuf,&i);
613 }
614 }
615
616 return 0;
617}
618BOOL GetParameterString(char *pEditBuf,int iPos,char *FuncName,char *Parameter){
619 extern char *pHeaderBuf;
620 extern char *pUserSource;
621 BOOL bRet;
622
623 //ユーザーソースコードを取得
624 if(pUserSource==0)
625 pUserSource=GetUserSourceCode();
626
627
628 //クラス、配列の構成要素を解析する
629 char VarName[VN_SIZE]; //変数名
630 char array[VN_SIZE]; //第1次配列
631 char lpPtrOffset[VN_SIZE]; //第2次配列
632 char NestMember[VN_SIZE]; //入れ子メンバ
633 int RefType; //"."参照のときは0、"->"参照のときは1
634 lstrcpy(VarName,FuncName);
635 if(!GetVarFormatString(VarName,array,lpPtrOffset,NestMember,&RefType)) return 0;
636
637 if(RefType==0){
638 // キャレット位置のコード領域を判定(クラス/ローカル/グローバル)
639 int iProcPos;
640 char NowClass[VN_SIZE];
641 GetCodeAreaType(pEditBuf,iPos,&iProcPos,NowClass);
642
643 if(NowClass[0]&&iProcPos!=-1){
644 //クラスメンバ関数領域
645 bRet=GetClassMemberFunctionParameter(pUserSource,NowClass,FuncName,Parameter);
646 if(!bRet){
647 bRet=GetClassMemberFunctionParameter(pHeaderBuf,NowClass,FuncName,Parameter);
648 }
649
650 if(bRet) return 1;
651 }
652
653 //通常関数
654 bRet=GetDefualtFunctionParameter(pUserSource,FuncName,Parameter);
655 if(!bRet){
656 bRet=GetDefualtFunctionParameter(pHeaderBuf,FuncName,Parameter);
657 }
658 }
659 else{
660 //メンバ関数
661 char ClassName[VN_SIZE];
662 BOOL bArray;
663
664 //オブジェクトのクラス名を取得
665 if(!GetVariableClassName(pEditBuf,iPos,VarName,ClassName,&bArray)) return 0;
666
667 //TypeDef宣言を考慮してオリジナルなクラス名を取得
668 GetOriginalClassName(ClassName);
669
670 if(!CheckReferType(ClassName,bArray,array,RefType)) return 0;
671
672 bRet=GetClassMemberFunctionParameter(pUserSource,ClassName,NestMember,Parameter);
673 if(!bRet){
674 bRet=GetClassMemberFunctionParameter(pHeaderBuf,ClassName,NestMember,Parameter);
675 }
676 }
677
678 DeleteComment(Parameter);
679
680 return bRet;
681}
682
683void ShowParameterHint(int WndNum){
684 extern HANDLE hHeap;
685 extern MDIINFO MdiInfo[MAX_WNDNUM];
686 extern METHODCHECKINFO MethodCheckInfo;
687 int i,i2,i3,IsStr,IsComment,PareNum,iPos;
688 char *pBuf;
689 char temp2[8192];
690
691 pBuf=MdiInfo[WndNum].pMdiTextEdit->buffer;
692
693 //キャレットが示すバッファインデックスを取得
694 iPos=GetBufferIndexFromCaretPos(
695 pBuf,
696 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.x,
697 MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y);
698
699 static int Before_StartCaretY;
700 BOOL Before_StartCaretSwitch=0;
701 if(MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y!=Before_StartCaretY){
702 Before_StartCaretY=MdiInfo[WndNum].pMdiTextEdit->StartCaretPos.y;
703 Before_StartCaretSwitch=1;
704 }
705
706 if(!MethodCheckInfo.hWnd){
707 ////////////////////////////////////////////////
708 // 新規の場合は選択されている行の先頭位置を取得
709 ////////////////////////////////////////////////
710
711 for(i=iPos;i>0;i--){
712 if(pBuf[i-1]=='\r'&&pBuf[i]=='\n'){
713 i++;
714 break;
715 }
716 }
717 MethodCheckInfo.HeadPos=i;
718
719 //注釈中かどうかを判定
720 for(i2=0,IsStr=0,IsComment=0;i2<MethodCheckInfo.HeadPos;i2++){
721 if(pBuf[i2]=='\"'){
722 i3=i2;
723 IsStr^=1;
724 }
725
726 //注釈(複数行)
727 if(pBuf[i2]=='/'&&pBuf[i2+1]=='*'&&IsStr==0&&IsComment==0){
728 i2+=2;
729 while(!(pBuf[i2]=='*'&&pBuf[i2+1]=='/')){
730 if(pBuf[i2]=='\0'){
731 i2--;
732 break;
733 }
734 i2++;
735 if(i2>=MethodCheckInfo.HeadPos) break;
736 }
737 if(i2>=MethodCheckInfo.HeadPos){
738 IsComment=1;
739 break;
740 }
741 continue;
742 }
743
744 //注釈(単行)
745 if(pBuf[i2]=='\''&&IsStr==0){
746 while(!(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
747 if(pBuf[i2]=='\0'){
748 i2--;
749 break;
750 }
751 i2++;
752 if(i2>=MethodCheckInfo.HeadPos) break;
753 }
754 if(i2>=MethodCheckInfo.HeadPos){
755 IsComment=1;
756 break;
757 }
758 continue;
759 }
760
761 if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'){
762 IsComment=0;
763 IsStr=0;
764 }
765 }
766
767 if(IsComment){
768 //注釈文の位置のときは抜け出す
769 return;
770 }
771 }
772 else{
773 /*既存のパラメータヒントが存在し、
774 以前の先頭位置よりも手前にカーソルが移動されたときは破棄する*/
775 if(iPos<=MethodCheckInfo.HeadPos){
776 DestroyWindow(MethodCheckInfo.hWnd);
777 MethodCheckInfo.hWnd=0;
778 }
779 }
780
781
782 ////////////////////////////////////////
783 // ダブルクォートの中かどうかを判別する
784 ////////////////////////////////////////
785
786 IsStr=0;
787 IsComment=0;
788 PareNum=0;
789 for(i2=MethodCheckInfo.HeadPos;i2<iPos;i2++){
790 if(pBuf[i2]=='\"'){
791 i3=i2;
792 IsStr^=1;
793 }
794
795 if(pBuf[i2]=='('&&IsStr==0&&IsComment==0) PareNum++;
796 if(pBuf[i2]==')'&&IsStr==0&&IsComment==0) PareNum--;
797
798 //注釈(複数行)
799 if(pBuf[i2]=='/'&&pBuf[i2+1]=='*'&&IsStr==0&&IsComment==0){
800 i2+=2;
801 while(!(pBuf[i2]=='*'&&pBuf[i2+1]=='/')){
802 if(pBuf[i2]=='\0'){
803 i2--;
804 break;
805 }
806 i2++;
807 if(i2>=iPos) break;
808 }
809 if(i2>=iPos){
810 IsComment=1;
811 break;
812 }
813 continue;
814 }
815
816 //注釈(単行)
817 if(pBuf[i2]=='\''&&IsStr==0){
818 while(!(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n')){
819 if(pBuf[i2]=='\0'){
820 i2--;
821 break;
822 }
823 i2++;
824 if(i2>=iPos) break;
825 }
826 if(i2>=iPos){
827 IsComment=1;
828 break;
829 }
830 continue;
831 }
832
833 if(pBuf[i2]=='\r'&&pBuf[i2+1]=='\n'){
834 if(PareNum==0){
835 //複数行にパラメータ記述がなされないとき
836 DestroyWindow(MethodCheckInfo.hWnd);
837 MethodCheckInfo.hWnd=0;
838 return;
839 }
840 IsComment=0;
841 IsStr=0;
842 }
843
844 }
845 if(IsStr){
846 if(!MethodCheckInfo.hWnd){
847 return;
848 }
849 i=i3-1;
850 }
851 else i=iPos-1;
852
853
854 for(PareNum=0;i>=MethodCheckInfo.HeadPos;i--){
855 if(pBuf[i]=='\"'){
856 i--;
857 while(pBuf[i]!='\"'){
858 i--;
859 if(i<MethodCheckInfo.HeadPos) break;
860 }
861 if(i<MethodCheckInfo.HeadPos) break;
862 continue;
863 }
864
865 //文の第一パラメータ時に表示する(すでに表示されている場合は無関係)
866 if((!MethodCheckInfo.hWnd)&&pBuf[i]==',') break;
867
868 if(pBuf[i]==')') PareNum--;
869 if(pBuf[i]=='('){
870 PareNum++;
871 if(PareNum>0){
872 i3=i+1;
873 i--;
874 while(pBuf[i]==' '||pBuf[i]=='\t') i--;
875 for(i2=0;i>=0;i--,i2++){
876 if(!IsVariableChar(pBuf[i])){
877 if(pBuf[i-1]=='-'&&pBuf[i]=='>'){
878 // "->" を含ませる
879 i--;
880 i2++;
881 continue;
882 }
883 break;
884 }
885 }
886 i++;
887 memcpy(temp2,pBuf+i,i2);
888 temp2[i2]=0;
889 if(i3<=iPos){
890 for(i2=0,IsStr=0,PareNum=0;i3<iPos;i3++){
891 if(pBuf[i3]=='\"') IsStr^=1;
892 if(pBuf[i3]=='('&&IsStr==0) PareNum++;
893 if(pBuf[i3]==')'&&IsStr==0){
894 PareNum--;
895 if(PareNum<0) break;
896 }
897 if(pBuf[i3]==','&&IsStr==0&&PareNum==0) i2++;
898 }
899 if(PareNum<0) i2=0x7FFFFFFF;
900 }
901 else i2=0x7FFFFFFF;
902
903 if(temp2[0]==0){
904 PareNum=0;
905 iPos=i;
906 continue;
907 }
908
909 if(lstrcmp(MethodCheckInfo.BeforeMethodName,temp2)!=0){
910 //新規の場合はパラメータ文字列を取得
911 if(!GetParameterString(pBuf,iPos,temp2,MethodCheckInfo.msg)){
912 PareNum=0;
913 iPos=i;
914 continue;
915 }
916 }
917 else if(MethodCheckInfo.ParmNum==i2&&Before_StartCaretSwitch==0){
918 //表示中のパラメータヒントに変更がないとき
919 //※行移動が行われた場合を除く
920 break;
921 }
922
923 //第何パラメータを太字にするかを示す
924 MethodCheckInfo.ParmNum=i2;
925
926 //パラメータヒントを表示
927 ShowCommandMessage();
928
929 lstrcpy(MethodCheckInfo.BeforeMethodName,temp2);
930 break;
931 }
932 }
933 if(i==MethodCheckInfo.HeadPos){
934
935 //行番号を飛び越す
936 while(pBuf[i]>='0'&&pBuf[i]<='9') i++;
937
938 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
939 for(i2=0;;i++,i2++){
940 if(!IsVariableChar(pBuf[i])){
941 temp2[i2]=0;
942 break;
943 }
944 temp2[i2]=pBuf[i];
945 }
946 while(pBuf[i]==' '||pBuf[i]=='\t') i++;
947 if(pBuf[i]=='(') i++;
948 if(i<=iPos){
949 for(i2=0,IsStr=0,PareNum=0;i<iPos;i++){
950 if(pBuf[i]=='\"') IsStr^=1;
951 if(pBuf[i]=='('&&IsStr==0) PareNum++;
952 if(pBuf[i]==')'&&IsStr==0){
953 PareNum--;
954 if(PareNum<0) break;
955 }
956 if(pBuf[i]==','&&IsStr==0&&PareNum==0) i2++;
957 }
958 if(PareNum<0) temp2[0]=0;
959 }
960 else i2=0x7FFFFFFF;
961 if(SetCommandMessageToMethodCheck(temp2)){
962 //第何パラメータを太字にするかを示す
963 MethodCheckInfo.ParmNum=i2;
964
965 //パラメータヒントを表示
966 ShowCommandMessage();
967
968 lstrcpy(MethodCheckInfo.BeforeMethodName,temp2);
969 }
970 else{
971 if(MethodCheckInfo.hWnd){
972 UpdateWindow(MdiInfo[WndNum].pMdiTextEdit->hEdit); //ちらつき防止
973
974 DestroyWindow(MethodCheckInfo.hWnd);
975 MethodCheckInfo.hWnd=0;
976 }
977 }
978 break;
979 }
980 }
981
982 extern char *pUserSource;
983 if(pUserSource){
984 HeapDefaultFree(pUserSource);
985 pUserSource=0;
986 }
987}
988
989
990//////////////////////////////////////
991// パラメータヒントのインターフェイス
992//////////////////////////////////////
993
994int DrawParam_StartScreenPosX;
995int DrawParam_PosY;
996int DrawParam_TextHeight;
997int DrawParam_MaxX;
998void TextOut_ToParmHint(HDC hdc,HFONT hFont,char *buffer,SIZE *pSize){
999 int i,i2;
1000 HFONT hOldFont;
1001
1002 i=lstrlen(buffer);
1003 hOldFont=(HFONT)SelectObject(hdc,hFont);
1004
1005 i2=pSize->cx;
1006 GetTextExtentPoint32(hdc,buffer,i,pSize);
1007 if(DrawParam_StartScreenPosX+i2+pSize->cx >= ScreenX){
1008 DrawParam_PosY+=DrawParam_TextHeight;
1009 i2=10;
1010 }
1011 TextOut(hdc,i2,DrawParam_PosY,buffer,i);
1012 pSize->cx+=i2;
1013
1014 if(DrawParam_MaxX<pSize->cx) DrawParam_MaxX=pSize->cx;
1015
1016 SelectObject(hdc,hOldFont);
1017}
1018void DrawParameterHint(HDC hdc,SIZE *pSize){
1019 extern METHODCHECKINFO MethodCheckInfo;
1020 int i,i2,i3,counter;
1021 char temporary[8192];
1022 HFONT hOldFont;
1023
1024 SetBkMode(hdc,TRANSPARENT);
1025
1026 DrawParam_PosY=2;
1027
1028 //命令語、関数の識別名
1029 for(i=0;;i++){
1030 temporary[i]=MethodCheckInfo.msg[i];
1031 if(MethodCheckInfo.msg[i]=='\0') break;
1032 if(MethodCheckInfo.msg[i]==' '||MethodCheckInfo.msg[i]=='('){
1033 i++;
1034 temporary[i]=0;
1035 break;
1036 }
1037 }
1038 hOldFont=(HFONT)SelectObject(hdc,MethodCheckInfo.hFont);
1039 TextOut(hdc,2,2,temporary,lstrlen(temporary));
1040 GetTextExtentPoint32(hdc,temporary,lstrlen(temporary),pSize);
1041 SelectObject(hdc,hOldFont);
1042 pSize->cx+=2;
1043 DrawParam_TextHeight=pSize->cy;
1044
1045 DrawParam_MaxX=pSize->cx;
1046
1047 for(i2=0,counter=0;;i++,i2++){
1048 if(MethodCheckInfo.msg[i]=='('){
1049 i3=GetStringInPare(temporary+i2,MethodCheckInfo.msg+i);
1050 i+=i3-1;
1051 i2+=i3-1;
1052 }
1053 if(MethodCheckInfo.msg[i]==','||
1054 MethodCheckInfo.msg[i]==')'||
1055 MethodCheckInfo.msg[i]=='\0'){
1056 temporary[i2]=0;
1057 if(MethodCheckInfo.ParmNum==counter){
1058 //太字フォントパラメータ
1059 TextOut_ToParmHint(hdc,MethodCheckInfo.hBoldFont,temporary,pSize);
1060 }
1061 else{
1062 //通常フォントパラメータ
1063 TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
1064 }
1065 counter++;
1066
1067 if(MethodCheckInfo.msg[i]==','){
1068 temporary[0]=',';
1069 temporary[1]=' ';
1070 temporary[2]=0;
1071
1072 TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
1073
1074 i++;
1075 while(MethodCheckInfo.msg[i]==' '||MethodCheckInfo.msg[i]=='\t') i++;
1076 i--;
1077 }
1078 else if(MethodCheckInfo.msg[i]==')'){
1079 lstrcpy(temporary,MethodCheckInfo.msg+i);
1080
1081 TextOut_ToParmHint(hdc,MethodCheckInfo.hFont,temporary,pSize);
1082
1083 break;
1084 }
1085 else if(MethodCheckInfo.msg[i]=='\0') break;
1086
1087 i2=-1;
1088 continue;
1089 }
1090 temporary[i2]=MethodCheckInfo.msg[i];
1091 }
1092
1093 pSize->cx=DrawParam_MaxX+20;
1094 pSize->cy=DrawParam_PosY+DrawParam_TextHeight+2;
1095}
1096void ShowHelp_FromParamHint(void){
1097 extern METHODCHECKINFO MethodCheckInfo;
1098 int i;
1099 char temporary[MAX_PATH],temp2[255];
1100 HH_AKLINK ak;
1101
1102 for(i=0;;i++){
1103 if(MethodCheckInfo.msg[i]=='('||MethodCheckInfo.msg[i]==' '||
1104 MethodCheckInfo.msg[i]=='\0'){
1105 temp2[i]=0;
1106 break;
1107 }
1108 temp2[i]=MethodCheckInfo.msg[i];
1109 }
1110
1111 memset(&ak, 0, sizeof(HH_AKLINK));
1112 ak.cbStruct = sizeof(HH_AKLINK);
1113 ak.pszKeywords = temp2;
1114 ak.fIndexOnFail=1;
1115
1116 sprintf(temporary,"%sBasicHelp.chm",pj_editor_Dir);
1117 HtmlHelp(NULL,temporary,HH_KEYWORD_LOOKUP,(DWORD)&ak);
1118}
1119LRESULT CALLBACK MethodCheckWindow(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){
1120 extern METHODCHECKINFO MethodCheckInfo;
1121 HDC hdc;
1122 HPEN hOldPen;
1123 HBRUSH hBrush,hOldBrush;
1124 PAINTSTRUCT ps;
1125 SIZE size;
1126 RECT rect;
1127 POINT pos;
1128
1129 switch(message){
1130 case WM_CREATE:
1131 GetCaretPos(&pos);
1132 ClientToScreen(GetWindow(hClient,GW_CHILD),&pos);
1133 DrawParam_StartScreenPosX=pos.x;
1134
1135 SetTimer(hwnd,1,50,0);
1136 return 0;
1137 case WM_PAINT:
1138 hdc=BeginPaint(hwnd,&ps);
1139
1140 //枠を描画
1141 GetClientRect(hwnd,&rect);
1142 hBrush=CreateSolidBrush(RGB(255,255,180));
1143 hOldPen=(HPEN)SelectObject(hdc,GetStockObject(BLACK_PEN));
1144 hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
1145 Rectangle(hdc,0,0,rect.right,rect.bottom);
1146 SelectObject(hdc,hOldPen);
1147 SelectObject(hdc,hOldBrush);
1148 DeleteObject(hBrush);
1149
1150 //パラメータヒントを描画
1151 DrawParameterHint(hdc,&size);
1152
1153 //[?]マークを描画
1154 HBITMAP hBmp,hOldBmp;
1155 HDC memdc;
1156 hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
1157 memdc=CreateCompatibleDC(hdc);
1158 hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
1159 GetClientRect(hwnd,&rect);
1160 BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
1161 SelectObject(memdc,hOldBmp);
1162 DeleteDC(memdc);
1163 DeleteObject(hBmp);
1164
1165 EndPaint(hwnd,&ps);
1166 return 0;
1167 case WM_TIMER:
1168 //[?]マークを描画
1169 static BOOL bOnMouse;
1170 GetClientRect(hwnd,&rect);
1171 GetCursorPos(&pos);
1172 ScreenToClient(hwnd,&pos);
1173 if(rect.right-14<=pos.x&&pos.x<=rect.right-1&&
1174 rect.bottom-14<=pos.y&&pos.y<=rect.bottom-1){
1175 if(bOnMouse) return 0;
1176
1177 hdc=GetDC(hwnd);
1178
1179 hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION2),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
1180 memdc=CreateCompatibleDC(hdc);
1181 hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
1182 GetClientRect(hwnd,&rect);
1183 BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
1184 SelectObject(memdc,hOldBmp);
1185 DeleteDC(memdc);
1186 DeleteObject(hBmp);
1187
1188 ReleaseDC(hwnd,hdc);
1189
1190 bOnMouse=1;
1191 }
1192 else{
1193 if(!bOnMouse) return 0;
1194
1195 hdc=GetDC(hwnd);
1196
1197 hBmp=(HBITMAP)LoadImage(hResInst,MAKEINTRESOURCE(IDB_PARAMHINT_QUESTION),IMAGE_BITMAP,0,0,LR_DEFAULTSIZE);
1198 memdc=CreateCompatibleDC(hdc);
1199 hOldBmp=(HBITMAP)SelectObject(memdc,hBmp);
1200 GetClientRect(hwnd,&rect);
1201 BitBlt(hdc,rect.right-14,rect.bottom-14,13,13,memdc,0,0,SRCCOPY);
1202 SelectObject(memdc,hOldBmp);
1203 DeleteDC(memdc);
1204 DeleteObject(hBmp);
1205
1206 ReleaseDC(hwnd,hdc);
1207 bOnMouse=0;
1208 }
1209 return 0;
1210 case WM_ACTIVATE:
1211 if(LOWORD(wParam)==WA_ACTIVE||LOWORD(wParam)==WA_CLICKACTIVE){
1212 SetFocus(GetWindow(hClient,GW_CHILD));
1213
1214 if(LOWORD(wParam)==WA_CLICKACTIVE){
1215 GetClientRect(hwnd,&rect);
1216 GetCursorPos(&pos);
1217 ScreenToClient(hwnd,&pos);
1218 if(rect.right-14<=pos.x&&pos.x<=rect.right-1&&
1219 rect.bottom-14<=pos.y&&pos.y<=rect.bottom-1){
1220 ShowHelp_FromParamHint();
1221 }
1222 }
1223 }
1224 return 0;
1225 case WM_DESTROY:
1226 MethodCheckInfo.BeforeMethodName[0]=0;
1227 return 0;
1228 }
1229 return DefWindowProc(hwnd,message,wParam,lParam);
1230}
1231void ShowCommandMessage(void){
1232 extern METHODCHECKINFO MethodCheckInfo;
1233 int i;
1234 int sw;
1235
1236 if(pobj_nv->dwParameterHint==1){
1237 //ポップアップ表示
1238
1239 extern HINSTANCE hInst;
1240 extern METHODCHECKINFO MethodCheckInfo;
1241 extern MDIINFO MdiInfo[MAX_WNDNUM];
1242 HDC hdc,memdc;
1243 RECT rect,rc2;
1244 SIZE size;
1245 POINT pos;
1246 if(!MethodCheckInfo.hWnd){
1247 MethodCheckInfo.hWnd=CreateWindow("MethodCheckWindow",NULL,WS_POPUP,
1248 0,0,0,0,
1249 hOwner,NULL,hInst,0);
1250 sw=1;
1251 }
1252 else sw=0;
1253 i=GetWndNum(GetWindow(hClient,GW_CHILD));
1254
1255 hdc=GetDC(MethodCheckInfo.hWnd);
1256 memdc=CreateCompatibleDC(hdc);
1257 DrawParameterHint(memdc,&size);
1258 DeleteDC(memdc);
1259 ReleaseDC(MethodCheckInfo.hWnd,hdc);
1260
1261 GetWindowRect(MdiInfo[i].hwnd,&rect);
1262 GetCaretPos(&pos);
1263 ClientToScreen(MdiInfo[i].pMdiTextEdit->hEdit,&pos);
1264 rect.left=pos.x-20;
1265 rect.top=pos.y-pobj_nv->lf.lfHeight;
1266 if(sw){
1267 MoveWindow(MethodCheckInfo.hWnd,rect.left,rect.top,size.cx,size.cy,1);
1268 ShowWindow(MethodCheckInfo.hWnd,SW_SHOWNOACTIVATE);
1269 }
1270 else{
1271 GetWindowRect(MethodCheckInfo.hWnd,&rc2);
1272
1273 MoveWindow(MethodCheckInfo.hWnd,
1274 rc2.left,
1275 rect.top,
1276 size.cx,
1277 size.cy,
1278 1);
1279
1280 InvalidateRect(MethodCheckInfo.hWnd,NULL,0);
1281 }
1282 }
1283
1284 //ステータスバーに表示
1285 else if(pobj_nv->dwParameterHint==2)
1286 SetStatusText(MethodCheckInfo.msg);
1287}
Note: See TracBrowser for help on using the repository browser.