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

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

・PROJECTINFO構造体を廃止し、Projectクラスを採用した。
・ProjectInfoをprojectInfoにリネーム

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