|
|
| version 1.3, 2003/10/24 14:16:54 | version 1.4, 2003/10/31 03:40:10 |
|---|---|
| Line 22 extern COMMNG cm_mpu98; | Line 22 extern COMMNG cm_mpu98; |
| static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5}; | static const char *mpuinterrupt[4] = {str_int0, str_int1, str_int2, str_int5}; |
| static BYTE mpu = 0; | static BYTE mpu = 0; |
| static SUBCLASSPROC oldidc_mpujmp = NULL; | |
| static void setmpuiopara(HWND hWnd, WORD res, BYTE value) { | static void setmpuiopara(HWND hWnd, WORD res, BYTE value) { |
| Line 88 static void setmpuintdip(BYTE *image, in | Line 87 static void setmpuintdip(BYTE *image, in |
| dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align); | dlgs_setjumpery(image, px + 3 - (mpu & 3), py, align); |
| } | } |
| static LRESULT CALLBACK mpujmp(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { | |
| PAINTSTRUCT ps; | // ---- |
| HDC hdc; | |
| HBITMAP hBitmap; | |
| HDC hMemDC; | |
| BYTE *image; | |
| HANDLE hwork; | |
| BITMAPINFO *work; | |
| BYTE *imgbtm; | |
| int align; | |
| switch(msg) { | static void mpucreate(HWND hWnd) { |
| case WM_PAINT: | |
| hdc = BeginPaint(hWnd, &ps); | UINT i; |
| if ((hwork = GlobalAlloc(GPTR, bit2res_getsize(&mpudip))) | char buf[8]; |
| == NULL) { | HWND sub; |
| break; | |
| } | mpu = np2cfg.mpuopt; |
| if ((work = (BITMAPINFO *)GlobalLock(hwork)) == NULL) { | for (i=0; i<16; i++) { |
| GlobalFree(hwork); | wsprintf(buf, str_4X, 0xC0D0 + (i << 10)); |
| break; | SendDlgItemMessage(hWnd, IDC_MPUIO, |
| } | CB_INSERTSTRING, (WPARAM)i, (LPARAM)buf); |
| 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); | 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 { | union { |
| char mmap[MAXPNAMELEN]; | char mmap[MAXPNAMELEN]; |
| Line 182 static void updatempu(HWND hWnd) { | Line 167 static void updatempu(HWND hWnd) { |
| sysmng_update(update); | 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 rect1; |
| RECT rect2; | RECT rect2; |
| POINT p; | POINT p; |
| BYTE bit; | |
| switch(msg) { | GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1); |
| case WM_INITDIALOG: | GetClientRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect2); |
| mpu = np2cfg.mpuopt; | GetCursorPos(&p); |
| for (i=0; i<16; i++) { | p.x += rect2.left - rect1.left; |
| char buf[8]; | p.y += rect2.top - rect1.top; |
| wsprintf(buf, str_4X, 0xC0D0 + (i << 10)); | p.x /= 9; |
| SendDlgItemMessage(hWnd, IDC_MPUIO, | p.y /= 9; |
| CB_INSERTSTRING, (WPARAM)i, (LPARAM)buf); | if ((p.y < 1) || (p.y >= 3)) { |
| } | return; |
| setmpuiopara(hWnd, IDC_MPUIO, mpu); | } |
| SETLISTSTR(hWnd, IDC_MPUINT, mpuinterrupt); | 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)) { | |
| bit = (BYTE)(12 - p.x); | |
| if ((mpu ^ bit) & 3) { | |
| mpu &= ~0x3; | |
| mpu |= bit; | |
| setmpuintpara(hWnd, IDC_MPUINT, mpu); | setmpuintpara(hWnd, IDC_MPUINT, mpu); |
| InvalidateRect(GetDlgItem(hWnd, IDC_MPUDIP), NULL, TRUE); | |
| } | |
| } | |
| } | |
| static void mpudrawdipsw(HWND hWnd, HDC hdc) { | |
| BITMAPINFO *bmi; | |
| HBITMAP hbmp; | |
| BYTE *image; | |
| int align; | |
| BYTE *imgbtm; | |
| HDC hmdc; | |
| dlgs_setlistmidiout(hWnd, IDC_MPU98MMAP, np2oscfg.mpu.mout); | bmi = (BITMAPINFO *)_MALLOC(bit2res_getsize(&mpudip), "bitmap"); |
| dlgs_setlistmidiin(hWnd, IDC_MPU98MDIN, np2oscfg.mpu.min); | if (bmi == NULL) { |
| SETLISTSTR(hWnd, IDC_MPU98MMDL, cmmidi_mdlname); | return; |
| SetDlgItemText(hWnd, IDC_MPU98MMDL, np2oscfg.mpu.mdl); | } |
| SetDlgItemCheck(hWnd, IDC_MPU98DEFE, np2oscfg.mpu.def_en); | bit2res_sethead(bmi, &mpudip); |
| SetDlgItemText(hWnd, IDC_MPU98DEFF, np2oscfg.mpu.def); | hbmp = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, |
| (void **)&image, NULL, 0); | |
| oldidc_mpujmp = (SUBCLASSPROC)GetWindowLong(GetDlgItem(hWnd, | bit2res_setdata(image, &mpudip); |
| IDC_MPUDIP), GWL_WNDPROC); | align = ((mpudip.x + 7) / 2) & ~3; |
| SetWindowLong(GetDlgItem(hWnd, IDC_MPUDIP), GWL_WNDPROC, | imgbtm = image + align * (mpudip.y - 1); |
| (LONG)mpujmp); | setmpuiodip(imgbtm, 2, 1, align, mpu); |
| SetFocus(GetDlgItem(hWnd, IDC_MPUIO)); // ver0.30 | setmpuintdip(imgbtm, 9, 1, align, mpu); |
| hmdc = CreateCompatibleDC(hdc); | |
| SelectObject(hmdc, hbmp); | |
| BitBlt(hdc, 0, 0, mpudip.x, mpudip.y, hmdc, 0, 0, SRCCOPY); | |
| DeleteDC(hmdc); | |
| DeleteObject(hbmp); | |
| _MFREE(bmi); | |
| } | |
| LRESULT CALLBACK MidiDialogProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) { | |
| switch(msg) { | |
| case WM_INITDIALOG: | |
| mpucreate(hWnd); | |
| return(FALSE); | return(FALSE); |
| case WM_COMMAND: | case WM_COMMAND: |
| switch(LOWORD(wp)) { | switch(LOWORD(wp)) { |
| case IDOK: | case IDOK: |
| updatempu(hWnd); | mpuupdate(hWnd); |
| EndDialog(hWnd, IDOK); | EndDialog(hWnd, IDOK); |
| break; | break; |
| Line 244 LRESULT CALLBACK MidiDialogProc(HWND hWn | Line 264 LRESULT CALLBACK MidiDialogProc(HWND hWn |
| return(FALSE); | return(FALSE); |
| case IDC_MPUDIP: | case IDC_MPUDIP: |
| GetWindowRect(GetDlgItem(hWnd, IDC_MPUDIP), &rect1); | mpucmddipsw(hWnd); |
| 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); | |
| } | |
| } | |
| return(FALSE); | return(FALSE); |
| case IDC_MPU98DEFB: | case IDC_MPU98DEFB: |
| Line 279 LRESULT CALLBACK MidiDialogProc(HWND hWn | Line 273 LRESULT CALLBACK MidiDialogProc(HWND hWn |
| } | } |
| break; | break; |
| case WM_DRAWITEM: | |
| if (LOWORD(wp) == IDC_MPUDIP) { | |
| mpudrawdipsw(hWnd, ((LPDRAWITEMSTRUCT)lp)->hDC); | |
| } | |
| return(FALSE); | |
| case WM_CLOSE: | case WM_CLOSE: |
| PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0); | PostMessage(hWnd, WM_COMMAND, IDCANCEL, 0); |
| break; | break; |