📄 w32g_subwin.c
字号:
ShowWindow(hTracerWnd,SW_HIDE); UpdateWindow(hTracerWnd);}BOOL CALLBACKTracerWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam){ switch (uMess){ case WM_INITDIALOG: return FALSE; case WM_COMMAND: switch (LOWORD(wParam)) { case IDCLOSE: ShowWindow(hwnd, SW_HIDE); MainWndUpdateTracerButton(); break; default: return FALSE; } case WM_SIZE: return FALSE; case WM_CLOSE: ShowWindow(hTracerWnd, SW_HIDE); MainWndUpdateTracerButton(); break; default: return FALSE; } return FALSE;}#endif//****************************************************************************// Doc Window#define IDM_DOCWND_CHOOSEFONT 4232int DocWndIndependent = 0; /* Independent document viewer mode.(撈棫僪僉儏儊儞僩價儏儚乕儌乕僪) */int DocWndAutoPopup = 0;DOCWNDINFO DocWndInfo;static BOOL CALLBACK DocWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam);static void InitDocEditWnd(HWND hParentWnd);static void DocWndConvertText(char *in, int in_size, char *out, int out_size);static void DocWndSetText(char *text, int text_size);static void DocWndSetInfo(char *info, char *filename);static void DocWndInfoInit(void);static int DocWndInfoLock(void);static void DocWndInfoUnLock(void);void InitDocWnd(HWND hParentWnd);void DocWndInfoReset(void);void DocWndAddDocFile(char *filename);void DocWndSetMidifile(char *filename);void DocWndReadDoc(int num);void DocWndReadDocNext(void);void DocWndReadDocPrev(void);static int DocWndInfoReset2(HWND hwnd);static int DocWndInfoApply(void);static int DocWndSetFontEdit(char *fontName, int fontWidth, int fontHeight);void InitDocWnd(HWND hParentWnd){ HMENU hMenu; HICON hIcon; if (hDocWnd != NULL) { DestroyWindow(hDocWnd); hDocWnd = NULL; } DocWndInfoReset2(hDocWnd); INILoadDocWnd(); switch(PlayerLanguage){ case LANGUAGE_ENGLISH: hDocWnd = CreateDialog (hInst,MAKEINTRESOURCE(IDD_DIALOG_DOC_EN),hParentWnd,DocWndProc); break; default: case LANGUAGE_JAPANESE: hDocWnd = CreateDialog (hInst,MAKEINTRESOURCE(IDD_DIALOG_DOC),hParentWnd,DocWndProc); break; } hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON_TIMIDITY), IMAGE_ICON, 16, 16, 0); if (hIcon!=NULL) SendMessage(hDocWnd,WM_SETICON,FALSE,(LPARAM)hIcon); DocWndInfoReset2(hDocWnd); hMenu = GetSystemMenu(DocWndInfo.hwnd,FALSE); switch(PlayerLanguage){ case LANGUAGE_JAPANESE: AppendMenu(hMenu,MF_SEPARATOR,0,0); AppendMenu(hMenu,MF_STRING,IDM_DOCWND_CHOOSEFONT,"僼僅儞僩偺慖戰"); break; default: case LANGUAGE_ENGLISH: AppendMenu(hMenu,MF_SEPARATOR,0,0); AppendMenu(hMenu,MF_STRING,IDM_DOCWND_CHOOSEFONT,"Choose Font"); break; } DocWndInfoReset2(hDocWnd); INILoadDocWnd(); DocWndInfoApply(); ShowWindow(hDocWnd,SW_HIDE); UpdateWindow(hDocWnd); EnableWindow(GetDlgItem(hDocWnd,IDC_BUTTON_PREV),FALSE); EnableWindow(GetDlgItem(hDocWnd,IDC_BUTTON_NEXT),FALSE);}static BOOL CALLBACKDocWndProc(HWND hwnd, UINT uMess, WPARAM wParam, LPARAM lParam){ switch (uMess){ case WM_INITDIALOG: PutsDocWnd("Doc Window\n"); DocWndInfoInit(); SetWindowPosSize(GetDesktopWindow(),hwnd,DocWndInfo.PosX, DocWndInfo.PosY ); return FALSE; case WM_DESTROY: { RECT rc; GetWindowRect(hwnd,&rc); DocWndInfo.Width = rc.right - rc.left; DocWndInfo.Height = rc.bottom - rc.top; } INISaveDocWnd(); break; case WM_SYSCOMMAND: switch(wParam){ case IDM_DOCWND_CHOOSEFONT: { char fontName[64]; int fontHeight; int fontWidth; strcpy(fontName,DocWndInfo.fontName); fontHeight = DocWndInfo.fontHeight; fontWidth = DocWndInfo.fontWidth; if(DlgChooseFont(hwnd,fontName,&fontHeight,&fontWidth)==0){ DocWndSetFontEdit(fontName,fontWidth,fontHeight); } break; } break; default: break; } case WM_COMMAND: switch (LOWORD(wParam)) { case IDCLOSE: ShowWindow(hwnd, SW_HIDE); MainWndUpdateDocButton(); break; case IDCLEAR: ClearDocWnd(); break; default: break; } switch (LOWORD(wParam)) { case IDC_BUTTON_NEXT: DocWndReadDocNext(); break; case IDC_BUTTON_PREV: DocWndReadDocPrev(); break; default: break; } return FALSE; // See PreDispatchMessage() in w32g2_main.c case WM_SYSKEYDOWN: case WM_KEYDOWN: { int nVirtKey = (int)wParam; switch(nVirtKey){ case VK_ESCAPE: SendMessage(hwnd,WM_CLOSE,0,0); break; } } break; case WM_CLOSE: ShowSubWindow(hDocWnd,0);// ShowWindow(hDocWnd, SW_HIDE); MainWndUpdateDocButton(); break; case WM_SIZE: switch(wParam){ case SIZE_MAXIMIZED: case SIZE_RESTORED: { // 側傫偐堄枴側偔柺搢(^^;; int x,y,cx,cy; int max = 0; int width; RECT rcParent; RECT rcEDIT_INFO, rcEDIT_FILENAME, rcBUTTON_PREV, rcBUTTON_NEXT, rcEDIT; HWND hwndEDIT_INFO, hwndEDIT_FILENAME, hwndBUTTON_PREV, hwndBUTTON_NEXT, hwndEDIT; int nWidth = LOWORD(lParam); int nHeight = HIWORD(lParam); GetWindowRect(hwnd,&rcParent); cx = rcParent.right-rcParent.left; cy = rcParent.bottom-rcParent.top; if(cx < 300) MoveWindow(hwnd,rcParent.left,rcParent.top,300,cy,TRUE); if(cy < 200) MoveWindow(hwnd,rcParent.left,rcParent.top,cx,200,TRUE); GetClientRect(hwnd,&rcParent); hwndEDIT = GetDlgItem(hwnd,IDC_EDIT); hwndEDIT_INFO = GetDlgItem(hwnd,IDC_EDIT_INFO); hwndEDIT_FILENAME = GetDlgItem(hwnd,IDC_EDIT_FILENAME); hwndBUTTON_PREV = GetDlgItem(hwnd,IDC_BUTTON_PREV); hwndBUTTON_NEXT = GetDlgItem(hwnd,IDC_BUTTON_NEXT); GetWindowRect(hwndEDIT,&rcEDIT); GetWindowRect(hwndEDIT_INFO,&rcEDIT_INFO); GetWindowRect(hwndEDIT_FILENAME,&rcEDIT_FILENAME); GetWindowRect(hwndBUTTON_PREV,&rcBUTTON_PREV); GetWindowRect(hwndBUTTON_NEXT,&rcBUTTON_NEXT); width = rcParent.right - rcParent.left; cx = rcBUTTON_NEXT.right-rcBUTTON_NEXT.left; cy = rcBUTTON_NEXT.bottom-rcBUTTON_NEXT.top; x = rcParent.right - cx - 5; y = rcParent.bottom - cy; MoveWindow(hwndBUTTON_NEXT,x,y,cx,cy,TRUE); width -= cx + 5; if(cy>max) max = cy; cx = rcBUTTON_PREV.right-rcBUTTON_PREV.left; cy = rcBUTTON_PREV.bottom-rcBUTTON_PREV.top; x -= cx + 5; y = rcParent.bottom - cy; MoveWindow(hwndBUTTON_PREV,x,y,cx,cy,TRUE); width -= cx; if(cy>max) max = cy; width -= 5;// cx = rcEDIT_INFO.right-rcEDIT_INFO.left; cx = (int)(width * 0.36); cy = rcEDIT_INFO.bottom-rcEDIT_INFO.top; x = rcParent.left; y = rcParent.bottom - cy; MoveWindow(hwndEDIT_INFO,x,y,cx,cy,TRUE); if(cy>max) max = cy; x += cx + 5;// cx = rcEDIT_FILENAME.right-rcEDIT_FILENAME.left; cx = (int)(width * 0.56); cy = rcEDIT_FILENAME.bottom-rcEDIT_FILENAME.top; y = rcParent.bottom - cy; MoveWindow(hwndEDIT_FILENAME,x,y,cx,cy,TRUE); if(cy>max) max = cy; cx = rcParent.right - rcParent.left; cy = rcParent.bottom - rcParent.top - max - 5; x = rcParent.left; y = rcParent.top; MoveWindow(hwndEDIT,x,y,cx,cy,TRUE); InvalidateRect(hwnd,&rcParent,FALSE); UpdateWindow(hwnd); GetWindowRect(hwnd,&rcParent); DocWndInfo.Width = rcParent.right - rcParent.left; DocWndInfo.Height = rcParent.bottom - rcParent.top; break; } case SIZE_MINIMIZED: case SIZE_MAXHIDE: case SIZE_MAXSHOW: default: break; } break; case WM_MOVE:// DocWndInfo.PosX = (int) LOWORD(lParam);// DocWndInfo.PosY = (int) HIWORD(lParam); { RECT rc; GetWindowRect(hwnd,&rc); DocWndInfo.PosX = rc.left; DocWndInfo.PosY = rc.top; } break; default: return FALSE; } return FALSE;}static int DocWndInfoReset2(HWND hwnd){// memset(&DocWndInfo,0,sizeof(DOCWNDINFO)); DocWndInfo.PosX = - 1; DocWndInfo.PosY = - 1; DocWndInfo.Height = 400; DocWndInfo.Width = 400; DocWndInfo.hPopupMenu = NULL; DocWndInfo.hwnd = hwnd; if ( hwnd != NULL ) DocWndInfo.hwndEdit = GetDlgItem(hwnd,IDC_EDIT); strcpy(DocWndInfo.fontNameEN,"Times New Roman"); strcpy(DocWndInfo.fontNameJA,"俵俽 柧挬"); DocWndInfo.fontHeight = 12; DocWndInfo.fontWidth = 6; DocWndInfo.fontFlags = FONT_FLAGS_FIXED; switch(PlayerLanguage){ case LANGUAGE_ENGLISH: DocWndInfo.fontName = DocWndInfo.fontNameEN; break; default: case LANGUAGE_JAPANESE: DocWndInfo.fontName = DocWndInfo.fontNameJA; break; } return 0;}static int DocWndInfoApply(void){ RECT rc; HFONT hFontPre = NULL; DWORD fdwPitch = (DocWndInfo.fontFlags&FONT_FLAGS_FIXED)?FIXED_PITCH:VARIABLE_PITCH; DWORD fdwItalic = (DocWndInfo.fontFlags&FONT_FLAGS_ITALIC)?TRUE:FALSE; HFONT hFont = CreateFont(DocWndInfo.fontHeight,DocWndInfo.fontWidth,0,0,FW_DONTCARE,fdwItalic,FALSE,FALSE, DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY, fdwPitch | FF_DONTCARE,DocWndInfo.fontName); if(hFont != NULL){ hFontPre = DocWndInfo.hFontEdit; DocWndInfo.hFontEdit = hFont; SendMessage(DocWndInfo.hwndEdit,WM_SETFONT,(WPARAM)DocWndInfo.hFontEdit,(LPARAM)MAKELPARAM(TRUE,0)); } GetWindowRect(DocWndInfo.hwnd,&rc); MoveWindow(DocWndInfo.hwnd,rc.left,rc.top,DocWndInfo.Width,DocWndInfo.Height,TRUE);// InvalidateRect(hwnd,&rc,FALSE);// UpdateWindow(hwnd); if(hFontPre!=NULL) CloseHandle(hFontPre); INISaveDocWnd(); return 0;}static int DocWndSetFontEdit(char *fontName, int fontWidth, int fontHeight){ strcpy(DocWndInfo.fontName,fontName); DocWndInfo.fontWidth = fontWidth; DocWndInfo.fontHeight = fontHeight; DocWndInfoApply(); return 0;}static char ControlCode[] = "@ABCDEFGHIJKLMNOPQRS";static void DocWndConvertText(char *in, int in_size, char *out, int out_size){ char *buffer = (char *)safe_malloc(sizeof(char)*out_size); int buffer_size = out_size; int i=0, j=0; int nl = 0;// Convert Return Code CR, LF -> CR+LF ,// Control Code -> ^? (^@, ^A, ^B, ...).// stage1: for(;;){ if(i>=in_size || j>=buffer_size-1) goto stage1_end; if(nl==13){ if(in[i]==13){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = 13; buffer[j++] = 10; i++; nl = 13; continue; } if(in[i]==10){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = 13; buffer[j++] = 10; i++; nl = 0; continue; } if(j>=buffer_size-2) goto stage1_end; buffer[j++] = 13; buffer[j++] = 10; if(in[i]>=0 && in[i]<=0x1f && in[i]!='\t'){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = '^'; buffer[j++] = ControlCode[in[i]]; } else { if(j>=buffer_size-1) goto stage1_end; buffer[j++] = in[i]; } i++; nl = 0; continue; } if(nl==10){ if(in[i]==13||in[i]==10){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = 13; buffer[j++] = 10; nl = in[i]; i++; continue; } if(j>=buffer_size-2) goto stage1_end; buffer[j++] = 13; buffer[j++] = 10; if(in[i]>=0 && in[i]<=0x1f && in[i]!='\t'){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = '^'; buffer[j++] = ControlCode[in[i]]; } else { if(j>=buffer_size-1) goto stage1_end; buffer[j++] = in[i]; } i++; nl = 0; continue; } if(in[i]==13||in[i]==10){ nl = in[i]; i++; continue; } if(in[i]>=0 && in[i]<=0x1f && in[i]!='\t'){ if(j>=buffer_size-2) goto stage1_end; buffer[j++] = '^'; buffer[j++] = ControlCode[in[i]]; } else { if(j>=buffer_size-1) goto stage1_end; buffer[j++] = in[i]; } i++; nl = 0; continue; }stage1_end: buffer[j] = '\0';// Convert KANJI Code.// stage2:#ifndef MAX2#define MAX2(x,y) ((x)>=(y)?(x):(y))#endif switch(PlayerLanguage){ case LANGUAGE_ENGLISH: default: strncpy(out,buffer,MAX2(buffer_size-1,out_size-1)); out[out_size-1] = '\0'; break; case LANGUAGE_JAPANESE: strncpy(out,buffer,MAX2(buffer_size-1,out_size-1)); nkf_convert(buffer,out,out_size-1,NULL,"SJIS"); out[out_size-1] = '\0'; break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -