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

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

・WindowInfoクラスをリファクタリング
・MdiInfoを単純配列からvectorに変更した。

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