--- np2/win9x/dialog/d_mpu98.cpp 2003/10/24 14:16:54 1.3 +++ np2/win9x/dialog/d_mpu98.cpp 2007/12/29 12:56:22 1.12 @@ -2,12 +2,13 @@ #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 @@ -20,129 +21,95 @@ extern COMMNG cm_mpu98; } #endif -static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5}; +static const CBPARAM cpInt[] = +{ + {MAKEINTRESOURCE(IDS_INT0), 0}, + {MAKEINTRESOURCE(IDS_INT1), 1}, + {MAKEINTRESOURCE(IDS_INT2), 2}, + {MAKEINTRESOURCE(IDS_INT5), 3}, +}; -static BYTE mpu = 0; -static SUBCLASSPROC oldidc_mpujmp = NULL; +static UINT8 mpu = 0; - -static void setmpuiopara(HWND hWnd, WORD res, BYTE value) { - - SendDlgItemMessage(hWnd, res, CB_SETCURSEL, - (WPARAM)((value >> 4) & 15), (LPARAM)0); +static void setmpuio(HWND hWnd, UINT8 cValue) +{ + dlgs_setcbcur(hWnd, IDC_MPUIO, (cValue & 0xf0)); } -static BYTE getmpuio(HWND hWnd, WORD res) { - - char work[8]; - - GetDlgItemText(hWnd, res, work, sizeof(work)); - return((milstr_solveHEX(work) >> 6) & 0xf0); +static UINT8 getmpuio(HWND hWnd) +{ + return dlgs_getcbcur(hWnd, IDC_MPUIO, 0x00); } -static void setmpuintpara(HWND hWnd, WORD res, BYTE value) { - - SendDlgItemMessage(hWnd, res, CB_SETCURSEL, - (WPARAM)(value & 3), (LPARAM)0); +static void setmpuint(HWND hWnd, UINT8 cValue) +{ + dlgs_setcbcur(hWnd, IDC_MPUINT, (cValue & 0x03)); } -static BYTE getmpuint(HWND hWnd, WORD res) { - - char work[8]; - BYTE ret; - - GetDlgItemText(hWnd, res, work, sizeof(work)); - ret = work[3] - '0'; - if (ret >= 3) { - ret = 3; - } - return(ret); +static UINT8 getmpuint(HWND hWnd) +{ + return dlgs_getcbcur(hWnd, IDC_MPUINT, 0x00); } -static void setmpujmp(HWND hWnd, BYTE value, BYTE bit) { - - if ((mpu ^ value) & bit) { - mpu &= ~bit; - mpu |= value; +static void setmpujmp(HWND hWnd, UINT8 cValue, UINT8 cBit) +{ + if ((mpu ^ cValue) & cBit) + { + mpu &= ~cBit; + mpu |= cValue; InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE); } } -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 mpucreate(HWND hWnd) +{ + UINT i; + TCHAR szBuf[8]; + int nIndex; + HWND sub; + + mpu = np2cfg.mpuopt; + for (i=0; i<16; i++) + { + wsprintf(szBuf, tchar_4X, 0xC0D0 + (i << 10)); + nIndex = (int)SendDlgItemMessage(hWnd, IDC_MPUIO, CB_ADDSTRING, + 0, (LPARAM)szBuf); + if (nIndex >= 0) + { + SendDlgItemMessage(hWnd, IDC_MPUIO, CB_SETITEMDATA, + (WPARAM)nIndex, (LPARAM)(i << 4)); } } -} + setmpuio(hWnd, mpu); -static void setmpuintdip(BYTE *image, int px, int py, int align, BYTE v) { - - dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align); -} + dlgs_setcbitem(hWnd, IDC_MPUINT, cpInt, NELEMENTS(cpInt)); + setmpuint(hWnd, mpu); -static LRESULT CALLBACK mpujmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { + 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); - PAINTSTRUCT ps; - HDC hdc; - HBITMAP hBitmap; - HDC hMemDC; - BYTE *image; - HANDLE hwork; - BITMAPINFO *work; - BYTE *imgbtm; - int align; + // SS_OWNERDRAWにすると IDEで不都合が出るので… + sub = GetDlgItem(hWnd, IDC_MPUDIP); + SetWindowLong(sub, GWL_STYLE, SS_OWNERDRAW + + (GetWindowLong(sub, GWL_STYLE) & (~SS_TYPEMASK))); - 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)); - } - return(FALSE); + 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; @@ -151,19 +118,19 @@ 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; } @@ -171,9 +138,9 @@ static void updatempu(HWND hWnd) { if (cm_mpu98) { cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFEN, np2oscfg.mpu.def_en); } - GetDlgItemText(hWnd, IDC_MPU98DEFF, s.mdef, sizeof(s.mdef)); + 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)); + milstr_ncpy(np2oscfg.mpu.def, s.mdef, NELEMENTS(np2oscfg.mpu.def)); if (cm_mpu98) { cm_mpu98->msg(cm_mpu98, COMMSG_MIMPIDEFFILE, (long)s.mdef); } @@ -182,45 +149,56 @@ static void updatempu(HWND hWnd) { 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; + + 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; + setmpuio(hWnd, mpu); + redraw = TRUE; + } + else if ((p.x >= 9) && (p.x < 13)) { + bit = (UINT8)(12 - p.x); + if ((mpu ^ bit) & 3) { + mpu &= ~0x3; + mpu |= bit; + setmpuint(hWnd, mpu); + redraw = TRUE; + } + } + if (redraw) { + InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE); + } +} + +LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { 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); - 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); - - 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 + mpucreate(hWnd); return(FALSE); case WM_COMMAND: switch(LOWORD(wp)) { case IDOK: - updatempu(hWnd); + mpuupdate(hWnd); EndDialog(hWnd, IDOK); break; @@ -229,48 +207,22 @@ LRESULT CALLBACK MidiDialogProc(HWND hWn break; case IDC_MPUIO: - setmpujmp(hWnd, getmpuio(hWnd, IDC_MPUIO), 0xf0); + setmpujmp(hWnd, getmpuio(hWnd), 0xf0); return(FALSE); case IDC_MPUINT: - setmpujmp(hWnd, getmpuint(hWnd, IDC_MPUINT), 0x03); + setmpujmp(hWnd, getmpuint(hWnd), 0x03); return(FALSE); case IDC_MPUDEF: mpu = 0x82; - setmpuiopara(hWnd, IDC_MPUIO, mpu); - setmpuintpara(hWnd, IDC_MPUINT, mpu); + setmpuio(hWnd, mpu); + setmpuint(hWnd, mpu); InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE); 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: @@ -279,6 +231,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;