1 /* FCE Ultra - NES/Famicom Emulator
\r
3 * Copyright notice for this file:
\r
4 * Copyright (C) 2002 Ben Parnell
\r
6 * This program is free software; you can redistribute it and/or modify
\r
7 * it under the terms of the GNU General Public License as published by
\r
8 * the Free Software Foundation; either version 2 of the License, or
\r
9 * (at your option) any later version.
\r
11 * This program is distributed in the hope that it will be useful,
\r
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
14 * GNU General Public License for more details.
\r
16 * You should have received a copy of the GNU General Public License
\r
17 * along with this program; if not, write to the Free Software
\r
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
\r
21 static void ConfigMisc(void);
\r
22 static void ConfigPalette(void);
\r
23 static void ConfigDirectories(void);
\r
25 static HMENU fceumenu=0;
\r
26 static HMENU recentmenu;
\r
30 void ShowCursorAbs(int w)
\r
35 if(stat==-1) {stat++; ShowCursor(1);}
\r
39 if(stat==0) {stat--; ShowCursor(0);}
\r
44 RECT *CalcWindowSize(void)
\r
48 al.right=VNSWID*winsizemul;
\r
50 al.bottom=totallines*winsizemul;
\r
52 AdjustWindowRectEx(&al,GetWindowLong(hAppWnd,GWL_STYLE),GetMenu(hAppWnd)!=NULL,GetWindowLong(hAppWnd,GWL_EXSTYLE));
\r
62 void UpdateMenu(void)
\r
64 static int *polo[2]={&genie,&palyo};
\r
65 static int polo2[2]={310,311};
\r
69 CheckMenuItem(fceumenu,polo2[x],*polo[x]?MF_CHECKED:MF_UNCHECKED);
\r
70 if(eoptions&EO_BGRUN)
\r
71 CheckMenuItem(fceumenu,301,MF_CHECKED);
\r
73 CheckMenuItem(fceumenu,301,MF_UNCHECKED);
\r
76 char *rfiles[10]={0,0,0,0,0,0,0,0,0,0};
\r
78 void UpdateRMenu(void)
\r
83 moo.cbSize=sizeof(moo);
\r
84 moo.fMask=MIIM_SUBMENU|MIIM_STATE;
\r
86 GetMenuItemInfo(GetSubMenu(fceumenu,0),102,FALSE,&moo);
\r
87 moo.hSubMenu=recentmenu;
\r
88 moo.fState=rfiles[0]?MFS_ENABLED:MFS_GRAYED;
\r
90 SetMenuItemInfo(GetSubMenu(fceumenu,0),102,FALSE,&moo);
\r
93 RemoveMenu(recentmenu,600+x,MF_BYCOMMAND);
\r
97 if(!rfiles[x]) continue;
\r
99 moo.cbSize=sizeof(moo);
\r
100 moo.fMask=MIIM_DATA|MIIM_ID|MIIM_TYPE;
\r
102 if(strlen(rfiles[x])<128)
\r
104 sprintf(tmp,"&%d. %s",(x+1)%10,rfiles[x]);
\r
107 sprintf(tmp,"&%d. %s",(x+1)%10,rfiles[x]+strlen(rfiles[x])-127);
\r
109 moo.cch=strlen(tmp);
\r
112 moo.dwTypeData=tmp;
\r
113 InsertMenuItem(recentmenu,0,1,&moo);
\r
115 DrawMenuBar(hAppWnd);
\r
118 void AddRecent(char *fn)
\r
124 if(!strcmp(rfiles[x],fn)) // Item is already in list.
\r
129 tmp=rfiles[x]; // Save pointer.
\r
131 rfiles[y]=rfiles[y-1]; // Move items down.
\r
133 rfiles[0]=tmp; // Put item on top.
\r
138 if(rfiles[9]) free(rfiles[9]);
\r
139 for(x=9;x;x--) rfiles[x]=rfiles[x-1];
\r
140 rfiles[0]=malloc(strlen(fn)+1);
\r
141 strcpy(rfiles[0],fn);
\r
145 void HideMenu(int h)
\r
149 SetMenu(hAppWnd,0);
\r
153 SetMenu(hAppWnd,fceumenu);
\r
157 static LONG WindowXC=1<<30,WindowYC;
\r
158 void HideFWindow(int h)
\r
165 GetWindowRect(hAppWnd,&bo);
\r
169 SetMenu(hAppWnd,0);
\r
170 desa=WS_POPUP|WS_CLIPSIBLINGS;
\r
174 desa=WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS;
\r
178 SetWindowLong(hAppWnd,GWL_STYLE,desa|(GetWindowLong(hAppWnd,GWL_STYLE)&WS_VISIBLE));
\r
179 SetWindowPos(hAppWnd,0,0,0,0,0,SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE|SWP_NOZORDER);
\r
182 void ToggleHideMenu(void)
\r
188 SetMainWindowStuff();
\r
192 static void ALoad(char *nameo)
\r
194 if((GI=FCEUI_LoadGame(nameo)))
\r
198 SetMainWindowStuff();
\r
200 RefreshThrottleFPS();
\r
201 if(eoptions&EO_FSAFTERLOAD)
\r
208 void LoadNewGamey(HWND hParent)
\r
210 const char filter[]="All usable files(*.nes,*.nsf,*.fds,*.unf,*.zip,*.gz)\0*.nes;*.nsf;*.fds;*.unf;*.zip;*.gz\0All non-compressed usable files(*.nes,*.nsf,*.fds,*.unf)\0*.nes;*.nsf;*.fds;*.unf\0All files (*.*)\0*.*\0";
\r
213 memset(&ofn,0,sizeof(ofn));
\r
214 ofn.lStructSize=sizeof(ofn);
\r
215 ofn.hInstance=fceu_hInstance;
\r
216 ofn.lpstrTitle="FCE Ultra Open File...";
\r
217 ofn.lpstrFilter=filter;
\r
219 ofn.hwndOwner=hParent;
\r
220 ofn.lpstrFile=nameo;
\r
222 ofn.Flags=OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY; //OFN_EXPLORER|OFN_ENABLETEMPLATE|OFN_ENABLEHOOK;
\r
223 ofn.lpstrInitialDir=gfsdir;
\r
224 if(GetOpenFileName(&ofn))
\r
226 if(gfsdir) free(gfsdir);
\r
227 if((gfsdir=malloc(ofn.nFileOffset+1)))
\r
229 strncpy(gfsdir,ofn.lpstrFile,ofn.nFileOffset);
\r
230 gfsdir[ofn.nFileOffset]=0;
\r
236 static uint32 mousex,mousey,mouseb;
\r
237 void GetMouseData(uint32 *x, uint32 *y, uint32 *b)
\r
243 if(eoptions&EO_USERFORCE)
\r
246 GetClientRect(hAppWnd,&t);
\r
248 *x=*x*VNSWID/(t.right?t.right:1);
\r
249 *y=*y*totallines/(t.bottom?t.bottom:1);
\r
260 *b=((mouseb==MK_LBUTTON)?1:0)|((mouseb==MK_RBUTTON)?2:0);
\r
263 static int sizchange=0;
\r
264 static int vchanged=0;
\r
266 LRESULT FAR PASCAL AppWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
\r
269 case WM_LBUTTONDOWN:
\r
271 case WM_RBUTTONDOWN:
\r
277 mousex=LOWORD(lParam);
\r
278 mousey=HIWORD(lParam);
\r
284 case WM_DISPLAYCHANGE:
\r
285 if(!fullscreen && !changerecursive)
\r
293 len=DragQueryFile((HANDLE)wParam,0,0,0)+1;
\r
294 if((ftmp=malloc(len)))
\r
296 DragQueryFile((HANDLE)wParam,0,ftmp,len);
\r
306 if(wParam>=600 && wParam<=609)
\r
308 if(rfiles[wParam-600]) ALoad(rfiles[wParam-600]);
\r
312 case 300:ToggleHideMenu();break;
\r
313 case 301:eoptions^=EO_BGRUN;UpdateMenu();break;
\r
315 case 310:genie^=1;FCEUI_SetGameGenie(genie);UpdateMenu();break;
\r
317 FCEUI_SetVidSystem(palyo);
\r
318 RefreshThrottleFPS();
\r
321 SetMainWindowStuff();
\r
324 case 320:StopSound();ConfigDirectories();break;
\r
325 case 321:StopSound();ConfigInput(hWnd);break;
\r
326 case 322:ConfigMisc();break;
\r
327 case 323:StopSound();ConfigNetplay();break;
\r
328 case 324:StopSound();ConfigPalette();break;
\r
329 case 325:StopSound();ConfigSound();break;
\r
330 case 326:ConfigVideo();break;
\r
332 case 200:DriverInterface(DES_RESET,0);break;
\r
333 case 201:DriverInterface(DES_POWER,0);break;
\r
334 case 202:ConfigCheats(hWnd);break;
\r
336 case 100:StopSound();
\r
337 LoadNewGamey(hWnd);
\r
341 FCEUI_CloseGame();
\r
345 case 110:FCEUI_SaveState();break;
\r
346 case 111:FCEUI_LoadState();break;
\r
354 if(CreateSoundSave())
\r
355 str="Stop Sound Logging";
\r
357 str="Log Sound As...";
\r
358 memset(&mi,0,sizeof(mi));
\r
359 mi.fMask=MIIM_DATA|MIIM_TYPE;
\r
360 mi.cbSize=sizeof(mi);
\r
361 GetMenuItemInfo(fceumenu,120,0,&mi);
\r
362 mi.fMask=MIIM_DATA|MIIM_TYPE;
\r
363 mi.cbSize=sizeof(mi);
\r
365 mi.cch=strlen(str);
\r
366 SetMenuItemInfo(fceumenu,120,0,&mi);
\r
369 case 130:DoFCEUExit();break;
\r
371 case 400:StopSound();ShowAboutBox();break;
\r
377 case WM_SYSCOMMAND:
\r
378 if(wParam==SC_KEYMENU)
\r
379 if(GI && InputTypeFC==SIFC_FKB && cidisabled)
\r
382 case WM_SYSKEYDOWN:
\r
383 if(GI && InputTypeFC==SIFC_FKB && cidisabled)
\r
384 break; /* Hopefully this won't break DInput... */
\r
386 if(fullscreen || tog)
\r
388 if(wParam==VK_MENU)
\r
393 if(!(lParam&0x40000000))
\r
394 DriverInterface(DES_RESET,0);
\r
402 /* Only disable command keys if a game is loaded(and the other
\r
403 conditions are right, of course). */
\r
404 if(InputTypeFC==SIFC_FKB)
\r
406 if(wParam==VK_SCROLL)
\r
409 FCEUI_DispMessage("Family Keyboard %sabled.",cidisabled?"en":"dis");
\r
412 break; /* Hopefully this won't break DInput... */
\r
414 if(GI->type==GIT_NSF)
\r
417 case VK_UP:DriverInterface(DES_NSFINC,0);break;
\r
418 case VK_DOWN:DriverInterface(DES_NSFDEC,0);break;
\r
419 case VK_RETURN:DriverInterface(DES_NSFRES,0);break;
\r
421 case VK_LEFT:if(!(lParam&0x40000000))
\r
422 DriverInterface(DES_NSFDEC,0); break;
\r
423 case VK_RIGHT:if(!(lParam&0x40000000))
\r
424 DriverInterface(DES_NSFINC,0); break;
\r
428 if(!(lParam&0x40000000))
\r
431 case VK_F11:DriverInterface(DES_POWER,0);break;
\r
432 case VK_F12:DoFCEUExit();break;
\r
433 case VK_F2:userpause^=1;break;
\r
434 case VK_F3:ToggleHideMenu();break;
\r
435 case VK_F4: UpdateMenu();
\r
437 if(!SetVideoMode(fullscreen^1))
\r
438 SetVideoMode(fullscreen);
\r
445 case WM_NCRBUTTONDOWN:
\r
446 case WM_NCMBUTTONDOWN:StopSound();goto proco;
\r
447 case WM_NCLBUTTONDOWN:StopSound();goto proco;
\r
449 case WM_ENTERMENULOOP:StopSound();goto proco;
\r
452 case WM_QUIT:DoFCEUExit();break;
\r
453 case WM_ACTIVATEAPP:
\r
464 return DefWindowProc(hWnd,msg,wParam,lParam);
\r
469 void UpdateFCEUWindow(void)
\r
474 if(vchanged && !fullscreen && !changerecursive && !nofocus)
\r
480 if(sizchange && !fullscreen && !(eoptions&EO_USERFORCE))
\r
482 GetWindowRect(hAppWnd,&wrect);
\r
483 h=wrect.bottom-wrect.top;
\r
484 w=wrect.right-wrect.left;
\r
486 winsizemul=(w-(winwidth-VNSWID*winsizemul)+(VNSWID>>1))>>8;
\r
489 winsizemul=(h-(winheight-totallines*winsizemul)+(totallines>>1))>>8;
\r
493 SetMainWindowStuff();
\r
500 void ByebyeWindow(void)
\r
502 SetMenu(hAppWnd,0);
\r
503 DestroyMenu(fceumenu);
\r
504 DestroyWindow(hAppWnd);
\r
507 int CreateMainWindow(void)
\r
509 WNDCLASSEX winclass;
\r
512 memset(&winclass,0,sizeof(winclass));
\r
513 winclass.cbSize=sizeof(WNDCLASSEX);
\r
514 winclass.style=CS_OWNDC|CS_HREDRAW|CS_VREDRAW|CS_SAVEBITS;
\r
515 winclass.lpfnWndProc=AppWndProc;
\r
516 winclass.cbClsExtra=0;
\r
517 winclass.cbWndExtra=0;
\r
518 winclass.hInstance=fceu_hInstance;
\r
519 winclass.hIcon=LoadIcon(fceu_hInstance, "ICON_1");
\r
520 winclass.hIconSm=LoadIcon(fceu_hInstance, "ICON_1");
\r
521 winclass.hCursor=LoadCursor(NULL, IDC_ARROW);
\r
522 winclass.hbrBackground=GetStockObject(BLACK_BRUSH);
\r
523 //winclass.lpszMenuName="FCEUMENU";
\r
524 winclass.lpszClassName="FCEULTRA";
\r
526 if(!RegisterClassEx(&winclass))
\r
529 AdjustWindowRectEx(&tmp,WS_OVERLAPPEDWINDOW,1,0);
\r
531 fceumenu=LoadMenu(fceu_hInstance,"FCEUMENU");
\r
532 recentmenu=CreateMenu();
\r
535 hAppWnd = CreateWindowEx(0,"FCEULTRA","FCE Ultra",
\r
536 WS_OVERLAPPEDWINDOW|WS_CLIPSIBLINGS, /* Style */
\r
537 CW_USEDEFAULT,CW_USEDEFAULT,256,240, /* X,Y ; Width, Height */
\r
538 NULL,fceumenu,fceu_hInstance,NULL );
\r
539 DragAcceptFiles(hAppWnd, 1);
\r
540 SetMainWindowStuff();
\r
545 int SetMainWindowStuff(void)
\r
550 GetWindowRect(hAppWnd,&tmp);
\r
552 if(WindowXC!=(1<<30))
\r
554 /* Subtracting and adding for if(eoptions&EO_USERFORCE) below. */
\r
555 tmp.bottom-=tmp.top;
\r
556 tmp.bottom+=WindowYC;
\r
558 tmp.right-=tmp.left;
\r
559 tmp.right+=WindowXC;
\r
567 if(eoptions&EO_USERFORCE)
\r
569 SetWindowPos(hAppWnd,HWND_TOP,tmp.left,tmp.top,0,0,SWP_NOSIZE|SWP_SHOWWINDOW);
\r
570 winwidth=tmp.right-tmp.left;
\r
571 winheight=tmp.bottom-tmp.top;
\r
575 srect=CalcWindowSize();
\r
576 SetWindowPos(hAppWnd,HWND_TOP,tmp.left,tmp.top,srect->right,srect->bottom,SWP_SHOWWINDOW);
\r
577 winwidth=srect->right;
\r
578 winheight=srect->bottom;
\r
582 ShowWindow(hAppWnd, SW_SHOWNORMAL);
\r
586 int GetClientAbsRect(LPRECT lpRect)
\r
590 if(!ClientToScreen(hAppWnd,&point)) return 0;
\r
592 lpRect->top=point.y;
\r
593 lpRect->left=point.x;
\r
595 if(eoptions&EO_USERFORCE)
\r
599 GetClientRect(hAppWnd,&al);
\r
601 lpRect->right=point.x+al.right;
\r
602 lpRect->bottom=point.y+al.bottom;
\r
606 lpRect->right=point.x+VNSWID*winsizemul;
\r
607 lpRect->bottom=point.y+totallines*winsizemul;
\r
613 void LoadPaletteFile(void)
\r
616 const char filter[]="All usable files(*.pal)\0*.pal\0All files (*.*)\0*.*\0";
\r
619 memset(&ofn,0,sizeof(ofn));
\r
620 ofn.lStructSize=sizeof(ofn);
\r
621 ofn.hInstance=fceu_hInstance;
\r
622 ofn.lpstrTitle="FCE Ultra Open Palette File...";
\r
623 ofn.lpstrFilter=filter;
\r
625 ofn.lpstrFile=nameo;
\r
627 ofn.Flags=OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
\r
628 ofn.lpstrInitialDir=0;
\r
629 if(GetOpenFileName(&ofn))
\r
631 if((fp=fopen(nameo,"rb")))
\r
633 fread(cpalette,1,192,fp);
\r
635 FCEUI_SetPaletteArray(cpalette);
\r
636 eoptions|=EO_CPALETTE;
\r
639 FCEUD_PrintError("Error opening palette file!");
\r
643 BOOL CALLBACK PaletteConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
646 case WM_INITDIALOG:
\r
648 CheckDlgButton(hwndDlg,100,BST_CHECKED);
\r
649 SendDlgItemMessage(hwndDlg,500,TBM_SETRANGE,1,MAKELONG(0,128));
\r
650 SendDlgItemMessage(hwndDlg,501,TBM_SETRANGE,1,MAKELONG(0,128));
\r
651 DriverInterface(DES_GETNTSCTINT,&ntsctint);
\r
652 DriverInterface(DES_GETNTSCHUE,&ntschue);
\r
653 SendDlgItemMessage(hwndDlg,500,TBM_SETPOS,1,ntsctint);
\r
654 SendDlgItemMessage(hwndDlg,501,TBM_SETPOS,1,ntschue);
\r
657 case WM_QUIT: goto gornk;
\r
660 switch(wParam&0xFFFF)
\r
662 case 100:ntsccol^=1;DriverInterface(DES_NTSCCOL,&ntsccol);break;
\r
666 case 201:FCEUI_SetPaletteArray(0);
\r
667 eoptions&=~EO_CPALETTE;
\r
671 ntsctint=SendDlgItemMessage(hwndDlg,500,TBM_GETPOS,0,(LPARAM)(LPSTR)0);
\r
672 ntschue=SendDlgItemMessage(hwndDlg,501,TBM_GETPOS,0,(LPARAM)(LPSTR)0);
\r
673 EndDialog(hwndDlg,0);
\r
680 static void ConfigPalette(void)
\r
682 DialogBox(fceu_hInstance,"PALCONFIG",hAppWnd,PaletteConCallB);
\r
683 DriverInterface(DES_SETNTSCTINT,&ntsctint);
\r
684 DriverInterface(DES_SETNTSCHUE,&ntschue);
\r
688 static BOOL CALLBACK MiscConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
691 case WM_INITDIALOG:
\r
692 if(eoptions&EO_NOSPRLIM)
\r
693 CheckDlgButton(hwndDlg,100,BST_CHECKED);
\r
694 if(eoptions&EO_FOAFTERSTART)
\r
695 CheckDlgButton(hwndDlg,102,BST_CHECKED);
\r
696 if(eoptions&EO_SNAPNAME)
\r
697 CheckDlgButton(hwndDlg,103,BST_CHECKED);
\r
698 if(eoptions&EO_NOTHROTTLE)
\r
699 CheckDlgButton(hwndDlg,101,BST_CHECKED);
\r
702 case WM_QUIT: goto gornk;
\r
705 switch(wParam&0xFFFF)
\r
709 if(IsDlgButtonChecked(hwndDlg,100)==BST_CHECKED)
\r
710 eoptions|=EO_NOSPRLIM;
\r
712 eoptions&=~EO_NOSPRLIM;
\r
713 if(IsDlgButtonChecked(hwndDlg,102)==BST_CHECKED)
\r
714 eoptions|=EO_FOAFTERSTART;
\r
716 eoptions&=~EO_FOAFTERSTART;
\r
717 if(IsDlgButtonChecked(hwndDlg,103)==BST_CHECKED)
\r
718 eoptions|=EO_SNAPNAME;
\r
720 eoptions&=~EO_SNAPNAME;
\r
721 if(IsDlgButtonChecked(hwndDlg,101)==BST_CHECKED)
\r
722 eoptions|=EO_NOTHROTTLE;
\r
724 eoptions&=~EO_NOTHROTTLE;
\r
725 EndDialog(hwndDlg,0);
\r
732 void DoMiscConfigFix(void)
\r
734 FCEUI_DisableSpriteLimitation(eoptions&EO_NOSPRLIM);
\r
735 FCEUI_SetSnapName(eoptions&EO_SNAPNAME);
\r
738 static void ConfigMisc(void)
\r
740 DialogBox(fceu_hInstance,"MISCCONFIG",hAppWnd,MiscConCallB);
\r
744 static int BrowseForFolder(HWND hParent, char *htext, char *buf)
\r
747 LPCITEMIDLIST pidl;
\r
752 memset(&bi,0,sizeof(bi));
\r
754 bi.hwndOwner=hParent;
\r
755 bi.lpszTitle=htext;
\r
756 bi.ulFlags=BIF_RETURNONLYFSDIRS;
\r
758 if(FAILED(CoInitialize(0)))
\r
761 if(!(pidl=SHBrowseForFolder(&bi)))
\r
767 if(!SHGetPathFromIDList(pidl,buf))
\r
774 /* This probably isn't the best way to free the memory... */
\r
775 CoTaskMemFree((PVOID)pidl);
\r
782 static BOOL CALLBACK DirConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
\r
787 case WM_INITDIALOG:
\r
789 SetDlgItemText(hwndDlg,100+x,DOvers[x]);
\r
791 if(eoptions&EO_BSAV)
\r
792 CheckDlgButton(hwndDlg,300,BST_CHECKED);
\r
795 case WM_QUIT: goto gornk;
\r
799 if((wParam&0xFFFF)>=200 && (wParam&0xFFFF)<=205)
\r
801 static char *helpert[6]={"Cheats","Miscellaneous","Nonvolatile Game Data","Save States","Screen Snapshots","Base Directory"};
\r
802 char name[MAX_PATH];
\r
804 if(BrowseForFolder(hwndDlg,helpert[((wParam&0xFFFF)-200)],name))
\r
805 SetDlgItemText(hwndDlg,100+((wParam&0xFFFF)-200),name);
\r
807 else switch(wParam&0xFFFF)
\r
812 RemoveDirs(); // Remove empty directories.
\r
817 len=SendDlgItemMessage(hwndDlg,100+x,WM_GETTEXTLENGTH,0,0);
\r
820 if(DOvers[x]) free(DOvers[x]);
\r
824 len++; // Add 1 for null character.
\r
825 if(!(DOvers[x]=malloc(len)))
\r
827 if(!GetDlgItemText(hwndDlg,100+x,DOvers[x],len))
\r
835 if(IsDlgButtonChecked(hwndDlg,300)==BST_CHECKED)
\r
838 eoptions&=~EO_BSAV;
\r
840 CreateDirs(); // Create needed directories.
\r
841 SetDirs(); // Set the directories in the core.
\r
842 EndDialog(hwndDlg,0);
\r
852 static void ConfigDirectories(void)
\r
854 DialogBox(fceu_hInstance,"DIRCONFIG",hAppWnd,DirConCallB);
\r