📄 w32g_i.c
字号:
TrackPopupMenu(Canvas.hPopupMenu,TPM_TOPALIGN|TPM_LEFTALIGN, rc.left+(int)LOWORD(lParam),rc.top+(int)HIWORD(lParam), 0,Canvas.hwnd,NULL); PostMessage ( Canvas.hwnd, WM_NULL, 0, 0 ); } break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_CANVAS_GSLCD: CanvasChange(CANVAS_MODE_GSLCD); break; case IDM_CANVAS_MAP16: Canvas.MapMode = CMAP_MODE_16; CanvasChange(CANVAS_MODE_MAP16); break; case IDM_CANVAS_MAP32: Canvas.MapMode = CMAP_MODE_32; CanvasChange(CANVAS_MODE_MAP32); break; case IDM_CANVAS_KEYBOARD: CanvasChange(CANVAS_MODE_KBD_A); break; case IDM_CANVAS_KEYBOARD_A: Canvas.CKPart = 1; CanvasChange(CANVAS_MODE_KBD_A); break; case IDM_CANVAS_KEYBOARD_B: Canvas.CKPart = 2; CanvasChange(CANVAS_MODE_KBD_B); break; case IDM_CANVAS_SLEEP: CanvasChange(CANVAS_MODE_SLEEP); break; case IDM_CANVAS_REDRAW:// PanelResetPart(PANELRESET_CHANNEL); CanvasReset(); CanvasClear(); CanvasReadPanelInfo(1); CanvasUpdate(1); CanvasPaintAll(); break; } break; default: return DefWindowProc(hwnd,uMess,wParam,lParam) ; } return 0L;}// Color#define CCR_FORE RGB(0x00,0x00,0x00)#define CCR_BACK RGB(0x00,0xf0,0x00)#define CCR_DFORE RGB(0x70,0x00,0x00)#define CCR_DBACK RGB(0x00,0xf0,0x00)#define CCR_LOW RGB(0x80,0xd0,0x00)#define CCR_MIDDLE RGB(0xb0,0xb0,0x00)#define CCR_HIGH RGB(0xe0,0x00,0x00)// 怓傪 m : n 偱崿偤傞static COLORREF HalfColorMN(COLORREF fc, COLORREF bc, int m, int n){ return fc*m/(m+n) + bc*n/(m+n);}static COLORREF HalfColor23(COLORREF fc, COLORREF bc){ return HalfColorMN(fc,bc,2,3);}static COLORREF HalfColor15(COLORREF fc, COLORREF bc){ return HalfColorMN(fc,bc,1,5);}#define CC_BACK 0#define CC_FORE 1#define CC_LOW 2#define CC_MIDDLE 3#define CC_HIGH 4#define CC_FORE_HALF 11#define CC_LOW_HALF 12#define CC_MIDDLE_HALF 13#define CC_HIGH_HALF 14#define CC_FORE_WEAKHALF 15#define CC_DBACK 21#define CC_DFORE 22#define CC_DFORE_HALF 23#define CC_DFORE_WEAKHALF 24static COLORREF CanvasColor(int c){ switch(c){ case CC_BACK: return CCR_BACK; case CC_FORE: return CCR_FORE; case CC_FORE_HALF: return HalfColor15(CCR_FORE,CCR_BACK); case CC_FORE_WEAKHALF: return HalfColor23(CCR_FORE,CCR_BACK); case CC_DBACK: return CCR_DBACK; case CC_DFORE: return CCR_DFORE; case CC_DFORE_HALF: return HalfColor15(CCR_DFORE,CCR_DBACK); case CC_DFORE_WEAKHALF: return HalfColor23(CCR_DFORE,CCR_DBACK); case CC_LOW: return CCR_LOW; case CC_MIDDLE: return CCR_MIDDLE; case CC_HIGH: return CCR_HIGH; case CC_LOW_HALF: return HalfColor23(CCR_LOW,CCR_BACK); case CC_MIDDLE_HALF: return HalfColor23(CCR_MIDDLE,CCR_BACK); case CC_HIGH_HALF: return HalfColor23(CCR_HIGH,CCR_BACK); default: return CCR_BACK; }}static int CanvasOK = 0;static void CanvasInit(HWND hwnd){ RECT rc; GDI_LOCK(); // gdi_lock Canvas.hwnd = hwnd; Canvas.hParentWnd = GetParent(Canvas.hwnd); GetClientRect(Canvas.hParentWnd,&rc); MoveWindow(Canvas.hwnd,0,0,rc.right-rc.left,rc.bottom-rc.top,FALSE); GetClientRect(Canvas.hwnd,(RECT *)&(Canvas.rcMe)); Canvas.hdc = GetDC(Canvas.hwnd); Canvas.hbitmap = CreateCompatibleBitmap(Canvas.hdc,CANVAS_XMAX,CANVAS_YMAX); Canvas.hmdc = CreateCompatibleDC(Canvas.hdc); ReleaseDC(Canvas.hwnd,Canvas.hdc); Canvas.hBitmapSleep = LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_SLEEP)); Canvas.hgdiobj_hmdcprev = SelectObject(Canvas.hmdc,Canvas.hbitmap); SetRect((RECT *)&(Canvas.rcSleep),0,0,96,64); SetRect((RECT *)&(Canvas.rcMap),3,2+2,0,0); SetRect((RECT *)&(Canvas.rcKeyboard),1,1,0,0); SetRect((RECT *)&(Canvas.rcGSLCD),3,4,99,68); Canvas.rcMapMap.left = Canvas.rcMap.left; Canvas.rcMapMap.top = Canvas.rcMap.top; Canvas.rcMapMap.right = Canvas.rcMapMap.left + 6*16 - 1; Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*16 - 1; Canvas.rcMapSub.left = Canvas.rcMapMap.left; Canvas.rcMapSub.top = Canvas.rcMapMap.bottom + 2; Canvas.rcMapSub.right = Canvas.rcMapSub.left + 6*16 - 1; Canvas.rcMapSub.bottom = Canvas.rcMapSub.top +4+3+3+3+4 - 1; Canvas.MapDelay = 1; Canvas.MapResidual = 0; Canvas.MapMode = (MainWndInfo.CanvasMode == CANVAS_MODE_MAP32) ? CMAP_MODE_32 : CMAP_MODE_16; Canvas.MapBarMax = 16; // Canvas.CKNoteFrom = 24; // Canvas.CKNoteTo = 24 + 96; Canvas.CKNoteFrom = 12; Canvas.CKNoteTo = Canvas.CKNoteFrom + 96 + 3; Canvas.CKCh = 16; Canvas.CKPart = (MainWndInfo.CanvasMode == CANVAS_MODE_KBD_B) ? 2 : 1; Canvas.UpdateAll = 0; Canvas.Mode = (MainWndInfo.CanvasMode < CANVAS_MODE_GSLCD || MainWndInfo.CanvasMode > CANVAS_MODE_SLEEP) ? 1 : MainWndInfo.CanvasMode; Canvas.PaintDone = 0; GDI_UNLOCK(); // gdi_lock CanvasReset(); CanvasOK = 1;}// Canvas Mapstatic void CanvasMapClear(void){ HPEN hPen; HBRUSH hBrush; HGDIOBJ hgdiobj_hpen, hgdiobj_hbrush; if(!CanvasOK) return; GDI_LOCK(); // gdi_lock hPen = CreatePen(PS_SOLID,1,CanvasColor(CC_BACK)); hBrush = CreateSolidBrush(CanvasColor(CC_BACK)); hgdiobj_hpen = SelectObject(Canvas.hmdc, hPen); hgdiobj_hbrush = SelectObject(Canvas.hmdc, hBrush); Rectangle(Canvas.hmdc, Canvas.rcMe.left,Canvas.rcMe.top,Canvas.rcMe.right,Canvas.rcMe.bottom); SelectObject(Canvas.hmdc, hgdiobj_hpen); DeleteObject(hPen); SelectObject(Canvas.hmdc, hgdiobj_hbrush); DeleteObject(hBrush); GDI_UNLOCK(); // gdi_lock InvalidateRect(hCanvasWnd, NULL, FALSE);}static void CanvasMapReset(void){ int i,j,ch; if(!CanvasOK) return; switch(Canvas.MapMode){ case CMAP_MODE_32: Canvas.MapCh = 32;#ifdef MAPBAR_LIKE_TMIDI Canvas.MapBarWidth = 5; Canvas.MapBarMax = 10+1; Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax*2 + 6 - 1;#else Canvas.MapBarWidth = 2; Canvas.MapBarMax = 16; Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax - 1;#endif break; default: case CMAP_MODE_16: Canvas.MapCh = 16; Canvas.MapBarWidth = 5; Canvas.MapBarMax = 16; Canvas.rcMapMap.bottom = Canvas.rcMapMap.top + 3*Canvas.MapBarMax - 1; break; } for(i=0;i<Canvas.MapCh;i++){ for(j=0;j<Canvas.MapBarMax;j++){ Canvas.MapMap[i][j] = CC_FORE_HALF; Canvas.MapMapOld[i][j] = -1; } Canvas.MapBar[i] = -1; Canvas.MapBarOld[i] = -1; } for(ch=0;ch<Canvas.MapCh;ch++){ Canvas.MapPan[ch] = Canvas.MapPanOld[ch] = 2; Canvas.MapSustain[ch] = Canvas.MapSustainOld[ch] = 0; Canvas.MapExpression[ch] = Canvas.MapExpressionOld[ch] = 0; Canvas.MapVolume[ch] = Canvas.MapVolumeOld[ch] = 0; Canvas.MapPitchbend[ch] = Canvas.MapPitchbendOld[ch] = 0x2000; } Canvas.MapResidual = -1; Canvas.MapUpdateFlag = 1; Canvas.PaintDone = 0;}static void CanvasMapReadPanelInfo(int flag){ int ch,v; if(!CanvasOK) return; if(!PInfoOK) return; if(Canvas.UpdateAll) flag = 1; if(!Panel->changed && !flag) return; // Bar Canvas.DrumChannel = drumchannels; for(ch=0;ch<Canvas.MapCh;ch++){ Canvas.MapBarOld[ch] = Canvas.MapBar[ch]; if(Panel->v_flags[ch] == FLAG_NOTE_ON){#if 0 v = Panel->ctotal[ch]/8;#else v = (int) Panel->ctotal[ch] * Canvas.MapBarMax / 128;#endif } else { v = 0; } if(v<0) v = 0; else if(v>Canvas.MapBarMax-1) v = Canvas.MapBarMax-1; if(v != Canvas.MapBar[ch]){ // 抶墑 if(Canvas.MapDelay){ int old = Canvas.MapBar[ch]; if(Canvas.MapBar[ch]<0) Canvas.MapBar[ch] = v; else Canvas.MapBar[ch] = (old*10*1/3 + v*10*2/3)/10; if(old == Canvas.MapBar[ch]){ if(v>old) Canvas.MapBar[ch] = old + 1; else if(v<old) Canvas.MapBar[ch] = old - 1; } } else Canvas.MapBar[ch] = v; } if(Canvas.MapBarOld[ch] != Canvas.MapBar[ch]) Canvas.MapResidual = -1; } // Sub if(Canvas.MapMode==CMAP_MODE_16){ Canvas.MapChChanged = 0; for(ch=0;ch<Canvas.MapCh;ch++){ int changed = 0; Canvas.MapPanOld[ch] = Canvas.MapPan[ch]; Canvas.MapSustainOld[ch] = Canvas.MapSustain[ch]; Canvas.MapExpressionOld[ch] = Canvas.MapExpression[ch]; Canvas.MapVolumeOld[ch] = Canvas.MapVolume[ch]; Canvas.MapPitchbendOld[ch] = Canvas.MapPitchbend[ch]; if(Panel->channel[ch].panning==NO_PANNING) Canvas.MapPan[ch] = -1; else { Canvas.MapPan[ch] = ( Panel->channel[ch].panning - 64 ) * 3 /128;// Canvas.MapPan[ch] = ( 64 - Panel->channel[ch].panning ) * 3 /128; Canvas.MapPan[ch] = SetValue(Canvas.MapPan[ch],-2,2) + 2; } if(Panel->channel[ch].sustain) Canvas.MapSustain[ch] = 5; else Canvas.MapSustain[ch] = 0; //Canvas.MapSustain[ch] = SetValue(Canvas.MapSustain[ch],0,10);#if 0 Canvas.MapExpression[ch] = (Panel->channel[ch].expression * 11) >>8;#else Canvas.MapExpression[ch] = (Panel->channel[ch].expression * 11) >>7;#endif Canvas.MapExpression[ch] = SetValue(Canvas.MapExpression[ch],0,10);#if 0 Canvas.MapVolume[ch] = (Panel->channel[ch].volume * 11) >>8;#else Canvas.MapVolume[ch] = (Panel->channel[ch].volume * 11) >>7;#endif Canvas.MapVolume[ch] = SetValue(Canvas.MapVolume[ch],0,10); Canvas.MapPitchbend[ch] = Panel->channel[ch].pitchbend; if(Canvas.MapPanOld[ch]!=Canvas.MapPan[ch]) changed = 1; if(Canvas.MapSustainOld[ch]!=Canvas.MapSustain[ch]) changed = 1; if(Canvas.MapExpressionOld[ch]!=Canvas.MapExpression[ch]) changed = 1; if(Canvas.MapVolumeOld[ch]!=Canvas.MapVolume[ch]) changed = 1; if(Canvas.MapPitchbendOld[ch]!=Canvas.MapPitchbend[ch]) changed = 1; if(changed) Canvas.MapChChanged |= 1 << ch; } }}static void CanvasMapDrawMapBar(int flag){ int i,ch; if(!CanvasOK) return; if(Canvas.UpdateAll) flag = 1; if(!Canvas.MapResidual && !flag) return; Canvas.MapResidual = 0; for(ch=0;ch<Canvas.MapCh;ch++){ int drumflag = IS_SET_CHANNELMASK(Canvas.DrumChannel,ch); char color1,color2,color3; if(drumflag){ color1 = CC_DFORE; color2 = CC_DFORE_WEAKHALF; color3 = CC_DFORE_HALF; } else { color1 = CC_FORE; color2 = CC_FORE_WEAKHALF; color3 = CC_FORE_HALF; } for(i=0;i<Canvas.MapBarMax;i++){ int y = Canvas.MapBarMax-1-i; Canvas.MapMapOld[ch][y] = Canvas.MapMap[ch][y]; if(i<=Canvas.MapBar[ch]){ Canvas.MapMap[ch][y] = color1; Canvas.MapResidual = 1;#if 1 // 巆憸 } else if(i<=Canvas.MapBarOld[ch]){ Canvas.MapMap[ch][y] = color2; Canvas.MapResidual = 1;#endif } else { Canvas.MapMap[ch][y] = color3; } } } if(Canvas.MapResidual==0) Canvas.MapResidual = -1;}// #define CMAP_ALL_UPDATEstatic void CanvasMapUpdate(int flag){ RECT rc; int i,j; int change_flag = 0; if(!CanvasOK) return; CanvasMapDrawMapBar(flag); if(Canvas.UpdateAll) flag = 1; if(PInfoOK && Canvas.MapMode==CMAP_MODE_16){ if(flag || Panel->changed){ int ch; GDI_LOCK(); for(ch=0;ch<Canvas.MapCh;ch++){ int x,y; COLORREF color; COLORREF colorFG, colorBG; int drumflag = IS_SET_CHANNELMASK(Canvas.DrumChannel,ch); if(!flag && !(Canvas.MapChChanged & (1<<ch))) continue; if(drumflag){ colorFG = CanvasColor(CC_DFORE); colorBG = CanvasColor(CC_DFORE_HALF); } else { colorFG = CanvasColor(CC_FORE); colorBG = CanvasColor(CC_FORE_HALF); } rc.left = Canvas.rcMapSub.left + (5 + 1) * ch; rc.right = rc.left + 5 - 1; // PAN rc.top = Canvas.rcMapSub.top; rc.bottom = rc.top + 3 - 1; for(x=rc.left;x<=rc.right;x++){ for(y=rc.top;y<=rc.bottom;y++) SetPixelV(Canvas.hmdc,x,y,colorBG); } if(Canvas.MapPan[ch]>=0){ x = rc.left + Canvas.MapPan[ch]; for(y=rc.top;y<=rc.bottom;y++) SetPixelV(Canvas.hmdc,x,y,colorFG); } // SUSTAIN rc.top = rc.bottom + 2; rc.bottom = rc.top + 2 - 1; if(Canvas.MapSustain[ch]){ for(x=rc.left;x<=rc.right;x++){ for(y=rc.top;y<=rc.bottom;y++) SetPixelV(Canvas.hmdc,x,y,colorFG); } } else { for(x=rc.left;x<=rc.right;x++){ for(y=rc.top;y<=rc.bottom;y++) SetPixelV(Canvas.hmdc,x,y,colorBG); } // EXPRESSION rc.top = rc.bottom + 2; rc.bottom = rc.top + 2 - 1; for(i=1;i<=10;i++){ if(i <= Canvas.MapExpression[ch]) color = colorFG; else color = colorBG; x = rc.left + (i-1)/2; y = rc.top + (i+1)%2; SetPixelV(Canvas.hmdc,x,y,color); } // VOLUME rc.top = rc.bottom + 2; rc.bottom = rc.top + 2 - 1; for(i=1;i<=10;i++){ if(i <= Canvas.MapVolume[ch]) color = colorFG; else color = colorBG; x = rc.left + (i-1)/2; y = rc.top + (i+1)%2; SetPixelV(Canvas.hmdc,x,y,color); } // PITCH_BEND rc.top = rc.bottom + 2; rc.bottom = rc.top + 3 - 1; for(x=rc.left;x<=rc.right;x++){ for(y=rc.top;y<=rc.bottom;y++) SetPixelV(Canvas.hmdc,x,y,colorBG); } if(Canvas.MapPitchbend[ch]==-2){ y = rc.top + 1; for(x=rc.left;x<=rc.right;x++) SetPixelV(Canvas.hmdc,x,y,colorFG); y++; for(x=rc.left;x<=rc.right;x++) SetPixelV(Canvas.hmdc,x,y,colorFG); } else if(Canvas.MapPitchbend[ch]>0x2000){ y = rc.top; for(x=rc.left;x<=rc.left;x++) SetPixelV(Canvas.hmdc,x,y,colorFG); y++; for(x=rc.left;x<=rc.left+2;x++) SetPixelV(Canvas.hmdc,x,y,colorFG); y++; for(x=rc.left;x<=rc.left+4;x++) SetPixelV(Canvas.hmdc,x,y,colorFG); } else if(Canvas.MapPitchbend[ch]<0x2000){ y = rc.top; for(x=rc.right;x<=rc.right;x++) SetPixelV(Canvas.hmdc,x,y,colorFG);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -