--- np2/win9x/dialog/d_mpu98.cpp 2003/10/21 11:22:05 1.2 +++ np2/win9x/dialog/d_mpu98.cpp 2007/01/08 08:52:22 1.10 @@ -2,62 +2,68 @@ #include "strres.h" #include "resource.h" #include "np2.h" +#include "oemtext.h" #include "commng.h" #include "sysmng.h" #include "dialog.h" #include "dialogs.h" -#include "bit2res.h" #include "pccore.h" +#include "dipswbmp.h" #ifdef __cplusplus extern "C" { #endif + extern COMMNG cm_mpu98; + #ifdef __cplusplus } #endif -static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5}; +static const TCHAR *mpuinterrupt[4] = { + str_int0, str_int1, str_int2, str_int5}; -static BYTE mpu = 0; -static SUBCLASSPROC oldidc_mpujmp = NULL; +static UINT8 mpu = 0; -static void setmpuiopara(HWND hWnd, WORD res, BYTE value) { +static void setmpuiopara(HWND hWnd, UINT16 res, UINT8 value) { SendDlgItemMessage(hWnd, res, CB_SETCURSEL, (WPARAM)((value >> 4) & 15), (LPARAM)0); } -static BYTE getmpuio(HWND hWnd, WORD res) { +static UINT8 getmpuio(HWND hWnd, UINT16 res) { - char work[8]; + TCHAR work[8]; - GetDlgItemText(hWnd, res, work, sizeof(work)); - return((milstr_solveHEX(work) >> 6) & 0xf0); + GetDlgItemText(hWnd, res, work, NELEMENTS(work)); + return((UINT8)((miltchar_solveHEX(work) >> 6) & 0xf0)); } -static void setmpuintpara(HWND hWnd, WORD res, BYTE value) { +static void setmpuintpara(HWND hWnd, UINT16 res, UINT8 value) { SendDlgItemMessage(hWnd, res, CB_SETCURSEL, (WPARAM)(value & 3), (LPARAM)0); } -static BYTE getmpuint(HWND hWnd, WORD res) { +static UINT8 getmpuint(HWND hWnd, UINT16 res) { - char work[8]; - BYTE ret; + TCHAR work[8]; + TCHAR ret; - GetDlgItemText(hWnd, res, work, sizeof(work)); + GetDlgItemText(hWnd, res, work, NELEMENTS(work)); ret = work[3] - '0'; - if (ret >= 3) { + if (ret < 0) { + ret = 0; + } + else if (ret >= 3) { ret = 3; } - return(ret); + return((UINT8)ret); } -static void setmpujmp(HWND hWnd, BYTE value, BYTE bit) { +static void setmpujmp(HWND hWnd, UINT8 value, UINT8 bit) { if ((mpu ^ value) & bit) { mpu &= ~bit; @@ -66,81 +72,47 @@ static void setmpujmp(HWND hWnd, BYTE va } } -static void setmpuiodip(BYTE *image, int px, int py, int align, BYTE v) { - - int i, j, y; - - px *= 9; - px++; - py *= 9; - for (i=0; i<4; i++, px+=9, v<<=1) { - y = py + ((v&0x80)?5:9); - for (j=0; j<3; j++) { - dlgs_linex(image, px, y+j, 7, align, 2); - } - } -} - -static void setmpuintdip(BYTE *image, int px, int py, int align, BYTE v) { - dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align); -} +// ---- -static LRESULT CALLBACK mpujmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { +static void mpucreate(HWND hWnd) { - PAINTSTRUCT ps; - HDC hdc; - HBITMAP hBitmap; - HDC hMemDC; - BYTE *image; - HANDLE hwork; - BITMAPINFO *work; - BYTE *imgbtm; - int align; - - switch(msg) { - case WM_PAINT: - hdc = BeginPaint(hWnd, &ps); - if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&mpudip))) - == NULL) { - break; - } - if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) { - GlobalFree(hwork); - break; - } - bit2res_sethead(work, &mpudip); - hBitmap = CreateDIBSection(hdc, work, DIB_RGB_COLORS, - (void **)&image, NULL, 0); - bit2res_setdata(image, &mpudip); - align = ((mpudip.x + 7) / 2) & ~3; - imgbtm = image + align * (mpudip.y - 1); - setmpuiodip(imgbtm, 2, 1, align, mpu); - setmpuintdip(imgbtm, 9, 1, align, mpu); - if ((hMemDC = CreateCompatibleDC(hdc)) != NULL) { - SelectObject(hMemDC, hBitmap); - StretchBlt(hdc, 0, 0, mpudip.x, mpudip.y, hMemDC, - 0, 0, mpudip.x, mpudip.y, SRCCOPY); - DeleteDC(hMemDC); - } - DeleteObject(hBitmap); - EndPaint(hWnd, &ps); - GlobalUnlock(hwork); - GlobalFree(hwork); - break; - default: - return(CallWindowProc(oldidc_mpujmp, hWnd, msg, wp, lp)); + UINT i; + TCHAR buf[8]; + HWND sub; + + mpu = np2cfg.mpuopt; + for (i=0; i<16; i++) { + wsprintf(buf, tchar_4X, 0xC0D0 + (i << 10)); + SendDlgItemMessage(hWnd, IDC_MPUIO, + CB_INSERTSTRING, (WPARAM)i, (LPARAM)buf); } - return(FALSE); + setmpuiopara(hWnd, IDC_MPUIO, mpu); + SETLISTSTR(hWnd, IDC_MPUINT, mpuinterrupt); + setmpuintpara(hWnd, IDC_MPUINT, mpu); + + dlgs_setlistmidiout(hWnd, IDC_MPU98MMAP, np2oscfg.mpu.mout); + dlgs_setlistmidiin(hWnd, IDC_MPU98MDIN, np2oscfg.mpu.min); + SETLISTSTR(hWnd, IDC_MPU98MMDL, cmmidi_mdlname); + SetDlgItemText(hWnd, IDC_MPU98MMDL, np2oscfg.mpu.mdl); + SetDlgItemCheck(hWnd, IDC_MPU98DEFE, np2oscfg.mpu.def_en); + SetDlgItemText(hWnd, IDC_MPU98DEFF, np2oscfg.mpu.def); + + // SS_OWNERDRAWにすると IDEで不都合が出るので… + sub = GetDlgItem(hWnd, IDC_MPUDIP); + SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW + + (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK))); + + SetFocus(GetDlgItem(hWnd, IDC_MPUIO)); } -static void updatempu(HWND hWnd) { +static void mpuupdate(HWND hWnd) { union { - char mmap[MAXPNAMELEN]; - char mmdl[64]; - char mdef[MAX_PATH]; - char mdin[MAXPNAMELEN]; + OEMCHAR mmap[MAXPNAMELEN]; + OEMCHAR mmdl[64]; + OEMCHAR mdef[MAX_PATH]; + OEMCHAR mdin[MAXPNAMELEN]; } s; UINT update; @@ -149,71 +121,87 @@ static void updatempu(HWND hWnd) { np2cfg.mpuopt = mpu; update |= SYS_UPDATECFG | SYS_UPDATEMIDI; } - GetDlgItemText(hWnd, IDC_MPU98MMAP, s.mmap, sizeof(s.mmap)); + GetDlgItemText(hWnd, IDC_MPU98MMAP, s.mmap, NELEMENTS(s.mmap)); if (milstr_cmp(np2oscfg.mpu.mout, s.mmap)) { - milstr_ncpy(np2oscfg.mpu.mout, s.mmap, sizeof(np2oscfg.mpu.mout)); + milstr_ncpy(np2oscfg.mpu.mout, s.mmap, NELEMENTS(np2oscfg.mpu.mout)); update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI; } - GetDlgItemText(hWnd, IDC_MPU98MDIN, s.mdin, sizeof(s.mdin)); + GetDlgItemText(hWnd, IDC_MPU98MDIN, s.mdin, NELEMENTS(s.mdin)); if (milstr_cmp(np2oscfg.mpu.min, s.mdin)) { - milstr_ncpy(np2oscfg.mpu.min, s.mdin, sizeof(np2oscfg.mpu.min)); + milstr_ncpy(np2oscfg.mpu.min, s.mdin, NELEMENTS(np2oscfg.mpu.min)); update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI; } - GetDlgItemText(hWnd, IDC_MPU98MMDL, s.mmdl, sizeof(s.mmdl)); + GetDlgItemText(hWnd, IDC_MPU98MMDL, s.mmdl, NELEMENTS(s.mmdl)); if (milstr_cmp(np2oscfg.mpu.mdl, s.mmdl)) { - milstr_ncpy(np2oscfg.mpu.mdl, s.mmdl, sizeof(np2oscfg.mpu.mdl)); + milstr_ncpy(np2oscfg.mpu.mdl, s.mmdl, NELEMENTS(np2oscfg.mpu.mdl)); update |= SYS_UPDATEOSCFG | SYS_UPDATEMIDI; } np2oscfg.mpu.def_en = GetDlgItemCheck(hWnd, IDC_MPU98DEFE); - GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, sizeof(s.mdef)); + if (cm_mpu98) { + cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFEN, np2oscfg.mpu.def_en); + } + GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, NELEMENTS(s.mdef)); if (milstr_cmp(np2oscfg.mpu.def, s.mdef)) { - milstr_ncpy(np2oscfg.mpu.def, s.mdef, sizeof(np2oscfg.mpu.def)); -// commsmidi_toneload(&mpu98_comm, s.mdef); + milstr_ncpy(np2oscfg.mpu.def, s.mdef, NELEMENTS(np2oscfg.mpu.def)); + if (cm_mpu98) { + cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFFILE, (long)s.mdef); + } update |= SYS_UPDATEOSCFG; } sysmng_update(update); } -LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { +static void mpucmddipsw(HWND hWnd) { - BYTE b, bit; - int i; RECT rect1; RECT rect2; POINT p; + BOOL redraw; + UINT8 bit; - switch(msg) { - case WM_INITDIALOG: - mpu = np2cfg.mpuopt; - for (i=0; i<16; i++) { - char buf[8]; - wsprintf(buf, str_4X, 0xC0D0 + (i << 10)); - SendDlgItemMessage(hWnd, IDC_MPUIO, - CB_INSERTSTRING, (WPARAM)i, (LPARAM)buf); - } - setmpuiopara(hWnd, IDC_MPUIO, mpu); - SETLISTSTR(hWnd, IDC_MPUINT, mpuinterrupt); + GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1); + GetClientRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect2); + GetCursorPos(&p); + redraw = FALSE; + p.x += rect2.left - rect1.left; + p.y += rect2.top - rect1.top; + p.x /= 9; + p.y /= 9; + if ((p.y < 1) || (p.y >= 3)) { + return; + } + if ((p.x >= 2) && (p.x < 6)) { + bit = 0x80 >> (p.x - 2); + mpu ^= bit; + setmpuiopara(hWnd, IDC_MPUIO, mpu); + redraw = TRUE; + } + else if ((p.x >= 9) && (p.x < 13)) { + bit = (UINT8)(12 - p.x); + if ((mpu ^ bit) & 3) { + mpu &= ~0x3; + mpu |= bit; setmpuintpara(hWnd, IDC_MPUINT, mpu); + redraw = TRUE; + } + } + if (redraw) { + InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE); + } +} - dlgs_setlistmidiout(hWnd, IDC_MPU98MMAP, np2oscfg.mpu.mout); - dlgs_setlistmidiin(hWnd, IDC_MPU98MDIN, np2oscfg.mpu.min); - SETLISTSTR(hWnd, IDC_MPU98MMDL, cmmidi_mdlname); - SetDlgItemText(hWnd, IDC_MPU98MMDL, np2oscfg.mpu.mdl); - SetDlgItemCheck(hWnd, IDC_MPU98DEFE, np2oscfg.mpu.def_en); - SetDlgItemText(hWnd, IDC_MPU98DEFF, np2oscfg.mpu.def); - - oldidc_mpujmp = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd, - IDC_MPUDIP), GWL_WNDPROC); - SetWindowLong(GetDlgItem(hWnd, IDC_MPUDIP), GWL_WNDPROC, - (LONG)mpujmp); - SetFocus(GetDlgItem(hWnd, IDC_MPUIO)); // ver0.30 +LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { + + switch(msg) { + case WM_INITDIALOG: + mpucreate(hWnd); return(FALSE); case WM_COMMAND: switch(LOWORD(wp)) { case IDOK: - updatempu(hWnd); + mpuupdate(hWnd); EndDialog(hWnd, IDOK); break; @@ -237,33 +225,7 @@ LRESULT CALLBACK MidiDialogProc(HWND hWn return(FALSE); case IDC_MPUDIP: - GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1); - GetClientRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect2); - GetCursorPos(&p); - p.x += rect2.left - rect1.left; - p.y += rect2.top - rect1.top; - p.x /= 9; - p.y /= 9; - if ((p.y < 1) || (p.y >= 3)) { - return(FALSE); - } - if ((p.x >= 2) && (p.x < 6)) { - bit = 0x80 >> (p.x - 2); - mpu ^= bit; - setmpuiopara(hWnd, IDC_MPUIO, mpu); - InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), - NULL, TRUE); - } - else if ((p.x >= 9) && (p.x < 13)) { - b = (BYTE)(12 - p.x); - if ((mpu ^ b) & 3) { - mpu &= ~0x3; - mpu |= b; - setmpuintpara(hWnd, IDC_MPUINT, mpu); - InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), - NULL, TRUE); - } - } + mpucmddipsw(hWnd); return(FALSE); case IDC_MPU98DEFB: @@ -272,6 +234,13 @@ LRESULT CALLBACK MidiDialogProc(HWND hWn } break; + case WM_DRAWITEM: + if (LOWORD(wp) == IDC_MPUDIP) { + dlgs_drawbmp(((LPDRAWITEMSTRUCT)lp)->hDC, + dipswbmp_getmpu(mpu)); + } + return(FALSE); + case WM_CLOSE: PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0); break;