11#include "IPlugAPP_host.h"
17#define GET_MENU() GetMenu(gHWND)
19#define GET_MENU() SWELL_GetCurrentMenu()
24#if !defined NO_IGRAPHICS
26using namespace igraphics;
31void IPlugAPPHost::PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* inputDevInfo, RtAudio::DeviceInfo* outputDevInfo)
35 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_RESETCONTENT,0,0);
37 std::vector<int> matchedSRs;
39 if (inputDevInfo->probed && outputDevInfo->probed)
41 for (
int i=0; i<inputDevInfo->sampleRates.size(); i++)
43 for (
int j=0; j<outputDevInfo->sampleRates.size(); j++)
45 if(inputDevInfo->sampleRates[i] == outputDevInfo->sampleRates[j])
46 matchedSRs.push_back(inputDevInfo->sampleRates[i]);
51 for (
int k=0; k<matchedSRs.size(); k++)
53 buf.SetFormatted(20,
"%i", matchedSRs[k]);
54 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_ADDSTRING,0,(LPARAM)buf.Get());
55 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_SETITEMDATA,k,(LPARAM)matchedSRs[k]);
59 str.SetFormatted(32,
"%i", mState.mAudioSR);
61 LRESULT sridx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
62 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_SETCURSEL, sridx, 0);
65void IPlugAPPHost::PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
72 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_RESETCONTENT,0,0);
73 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_RESETCONTENT,0,0);
77 for (i=0; i<info->inputChannels -1; i++)
79 buf.SetFormatted(20,
"%i", i+1);
80 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
81 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
85 buf.SetFormatted(20,
"%i", i+1);
86 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
88 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_SETCURSEL, mState.mAudioInChanL - 1, 0);
89 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
92void IPlugAPPHost::PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
99 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_RESETCONTENT,0,0);
100 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_RESETCONTENT,0,0);
104 for (i=0; i<info->outputChannels -1; i++)
106 buf.SetFormatted(20,
"%i", i+1);
107 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
108 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
112 buf.SetFormatted(20,
"%i", i+1);
113 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
115 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_SETCURSEL, mState.mAudioOutChanL - 1, 0);
116 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
120void IPlugAPPHost::PopulateDriverSpecificControls(HWND hwndDlg)
123 int driverType = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
124 if(driverType == kDeviceASIO)
126 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), FALSE);
127 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), TRUE);
131 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), TRUE);
132 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), FALSE);
139 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_RESETCONTENT,0,0);
140 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_RESETCONTENT,0,0);
142 for (
int i = 0; i<mAudioInputDevs.size(); i++)
144 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioInputDevs[i]).c_str());
150 for (
int i = 0; i<mAudioOutputDevs.size(); i++)
152 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioOutputDevs[i]).c_str());
154 if(!strcmp(
GetAudioDeviceName(mAudioOutputDevs[i]).c_str(), mState.mAudioOutDev.Get()))
159 if(driverType == kDeviceASIO)
160 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, outdevidx, 0);
163 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, indevidx, 0);
165 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
167 RtAudio::DeviceInfo inputDevInfo;
168 RtAudio::DeviceInfo outputDevInfo;
170 if (mAudioInputDevs.size())
172 inputDevInfo = mDAC->getDeviceInfo(mAudioInputDevs[indevidx]);
173 PopulateAudioInputList(hwndDlg, &inputDevInfo);
176 if (mAudioOutputDevs.size())
178 outputDevInfo = mDAC->getDeviceInfo(mAudioOutputDevs[outdevidx]);
179 PopulateAudioOutputList(hwndDlg, &outputDevInfo);
182 PopulateSampleRateList(hwndDlg, &inputDevInfo, &outputDevInfo);
185void IPlugAPPHost::PopulateAudioDialogs(HWND hwndDlg)
187 PopulateDriverSpecificControls(hwndDlg);
199 for (
int i = 0; i< kNumBufferSizeOptions; i++)
201 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_BUF_SIZE,CB_ADDSTRING,0,(LPARAM)kBufferSizeOptions[i].c_str());
205 str.SetFormatted(32,
"%i", mState.mBufferSize);
207 LRESULT iovsidx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
208 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_SETCURSEL, iovsidx, 0);
211bool IPlugAPPHost::PopulateMidiDialogs(HWND hwndDlg)
213 if ( !mMidiIn || !mMidiOut )
217 for (
int i=0; i<mMidiInputDevNames.size(); i++ )
219 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_ADDSTRING,0,(LPARAM)mMidiInputDevNames[i].c_str());
222 LRESULT indevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiInDev.Get());
227 mState.mMidiInDev.Set(
"off");
232 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_SETCURSEL, indevidx, 0);
234 for (
int i=0; i<mMidiOutputDevNames.size(); i++ )
236 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_ADDSTRING,0,(LPARAM)mMidiOutputDevNames[i].c_str());
239 LRESULT outdevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiOutDev.Get());
244 mState.mMidiOutDev.Set(
"off");
249 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
253 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
254 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
258 for (
int i=0; i<16; i++)
260 buf.SetFormatted(20,
"%i", i+1);
261 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
262 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
265 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiInChan, 0);
266 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiOutChan, 0);
273void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
275 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"DirectSound");
276 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"ASIO");
277 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
279 PopulateAudioDialogs(hwndDlg);
280 PopulateMidiDialogs(hwndDlg);
284void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
286 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"CoreAudio");
288 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
290 PopulateAudioDialogs(hwndDlg);
291 PopulateMidiDialogs(hwndDlg);
294 #error NOT IMPLEMENTED
297WDL_DLGRET IPlugAPPHost::PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
300 AppState& mState = _this->mState;
301 AppState& mTempState = _this->mTempState;
302 AppState& mActiveState = _this->mActiveState;
304 auto getComboString = [&](WDL_String& str,
int item, WPARAM idx) {
305 std::string tempString;
306 long len = (long) SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXTLEN, idx, 0) + 1;
307 tempString.reserve(len);
308 SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXT, idx, (LPARAM) tempString.data());
309 str.Set(tempString.c_str());
316 _this->PopulatePreferencesDialog(hwndDlg);
322 switch (LOWORD(wParam))
325 if(mActiveState != mState)
326 _this->TryToChangeAudio();
328 EndDialog(hwndDlg, IDOK);
331 _this->TryToChangeAudio();
334 EndDialog(hwndDlg, IDCANCEL);
337 if (!_this->AudioSettingsInStateAreEqual(mState, mTempState)
338 || !_this->MIDISettingsInStateAreEqual(mState, mTempState))
342 _this->TryToChangeAudioDriverType();
344 _this->TryToChangeAudio();
349 case IDC_COMBO_AUDIO_DRIVER:
350 if (HIWORD(wParam) == CBN_SELCHANGE)
352 v = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
354 if(v != mState.mAudioDriverType)
356 mState.mAudioDriverType = v;
358 _this->TryToChangeAudioDriverType();
361 if (_this->mAudioInputDevs.size())
364 if (_this->mAudioOutputDevs.size())
365 mState.mAudioOutDev.Set(_this->
GetAudioDeviceName(_this->mAudioOutputDevs[0]).c_str());
368 mState.mAudioOutChanL = 1;
369 mState.mAudioOutChanR = 2;
371 _this->PopulateAudioDialogs(hwndDlg);
376 case IDC_COMBO_AUDIO_IN_DEV:
377 if (HIWORD(wParam) == CBN_SELCHANGE)
379 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_DEV, CB_GETCURSEL, 0, 0);
380 getComboString(mState.mAudioInDev, IDC_COMBO_AUDIO_IN_DEV, idx);
383 mState.mAudioInChanL = 1;
384 mState.mAudioInChanR = 2;
386 _this->PopulateDriverSpecificControls(hwndDlg);
390 case IDC_COMBO_AUDIO_OUT_DEV:
391 if (HIWORD(wParam) == CBN_SELCHANGE)
393 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_DEV, CB_GETCURSEL, 0, 0);
394 getComboString(mState.mAudioOutDev, IDC_COMBO_AUDIO_OUT_DEV, idx);
397 mState.mAudioOutChanL = 1;
398 mState.mAudioOutChanR = 2;
400 _this->PopulateDriverSpecificControls(hwndDlg);
404 case IDC_COMBO_AUDIO_IN_L:
405 if (HIWORD(wParam) == CBN_SELCHANGE)
407 mState.mAudioInChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_L, CB_GETCURSEL, 0, 0) + 1;
410 mState.mAudioInChanR = mState.mAudioInChanL + 1;
411 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
416 case IDC_COMBO_AUDIO_IN_R:
417 if (HIWORD(wParam) == CBN_SELCHANGE)
418 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
419 mState.mAudioInChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_R, CB_GETCURSEL, 0, 0);
422 case IDC_COMBO_AUDIO_OUT_L:
423 if (HIWORD(wParam) == CBN_SELCHANGE)
425 mState.mAudioOutChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_L, CB_GETCURSEL, 0, 0) + 1;
428 mState.mAudioOutChanR = mState.mAudioOutChanL + 1;
429 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
434 case IDC_COMBO_AUDIO_OUT_R:
435 if (HIWORD(wParam) == CBN_SELCHANGE)
436 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
437 mState.mAudioOutChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_R, CB_GETCURSEL, 0, 0);
447 case IDC_COMBO_AUDIO_BUF_SIZE:
448 if (HIWORD(wParam) == CBN_SELCHANGE)
450 int iovsidx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_GETCURSEL, 0, 0);
451 mState.mBufferSize = atoi(kBufferSizeOptions[iovsidx].c_str());
454 case IDC_COMBO_AUDIO_SR:
455 if (HIWORD(wParam) == CBN_SELCHANGE)
457 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETCURSEL, 0, 0);
458 mState.mAudioSR = (uint32_t) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETITEMDATA, idx, 0);
462 case IDC_BUTTON_OS_DEV_SETTINGS:
463 if (HIWORD(wParam) == BN_CLICKED) {
465 if( (_this->mState.mAudioDriverType == kDeviceASIO) && (_this->mDAC->isStreamRunning() ==
true))
468 if(SWELL_GetOSXVersion() >= 0x1200) {
469 system(
"open \"/System/Applications/Utilities/Audio MIDI Setup.app\"");
471 system(
"open \"/Applications/Utilities/Audio MIDI Setup.app\"");
474 #error NOT IMPLEMENTED
479 case IDC_COMBO_MIDI_IN_DEV:
480 if (HIWORD(wParam) == CBN_SELCHANGE)
482 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_DEV, CB_GETCURSEL, 0, 0);
483 getComboString(mState.mMidiInDev, IDC_COMBO_MIDI_IN_DEV, idx);
484 _this->SelectMIDIDevice(ERoute::kInput, mState.mMidiInDev.Get());
488 case IDC_COMBO_MIDI_OUT_DEV:
489 if (HIWORD(wParam) == CBN_SELCHANGE)
491 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_DEV, CB_GETCURSEL, 0, 0);
492 getComboString(mState.mMidiOutDev, IDC_COMBO_MIDI_OUT_DEV, idx);
493 _this->SelectMIDIDevice(ERoute::kOutput, mState.mMidiOutDev.Get());
497 case IDC_COMBO_MIDI_IN_CHAN:
498 if (HIWORD(wParam) == CBN_SELCHANGE)
499 mState.mMidiInChan = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_CHAN, CB_GETCURSEL, 0, 0);
502 case IDC_COMBO_MIDI_OUT_CHAN:
503 if (HIWORD(wParam) == CBN_SELCHANGE)
504 mState.mMidiOutChan = (
int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_CHAN, CB_GETCURSEL, 0, 0);
517static void ClientResize(HWND hWnd,
int nWidth,
int nHeight)
519 RECT rcClient, rcWindow;
521 int screenwidth, screenheight;
524 screenwidth = GetSystemMetrics(SM_CXSCREEN);
525 screenheight = GetSystemMetrics(SM_CYSCREEN);
526 x = (screenwidth / 2) - (nWidth / 2);
527 y = (screenheight / 2) - (nHeight / 2);
529 GetClientRect(hWnd, &rcClient);
530 GetWindowRect(hWnd, &rcWindow);
532 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
533 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
535 SetWindowPos(hWnd, 0, x, y, nWidth + ptDiff.x, nHeight + ptDiff.y, 0);
539extern float GetScaleForHWND(HWND hWnd);
543WDL_DLGRET IPlugAPPHost::MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
555 IPlugAPP* pPlug = pAppHost->GetPlug();
557 if (!pAppHost->OpenWindow(gHWND))
558 DBGMSG(
"couldn't attach gui\n");
560 width = pPlug->GetEditorWidth();
561 height = pPlug->GetEditorHeight();
563 ClientResize(hwndDlg, width, height);
565 ShowWindow(hwndDlg, SW_SHOW);
569 pAppHost->CloseWindow();
571 IPlugAPPHost::sInstance =
nullptr;
576 SWELL_PostQuitMessage(hwndDlg);
581 DestroyWindow(hwndDlg);
584 switch (LOWORD(wParam))
588 DestroyWindow(hwndDlg);
593 IPlugAPP* pPlug = pAppHost->GetPlug();
595 bool pluginOpensAboutBox = pPlug->OnHostRequestingAboutBox();
597 if (pluginOpensAboutBox ==
false)
600 info.Append(PLUG_COPYRIGHT_STR
"\nBuilt on " __DATE__);
601 MessageBox(hwndDlg, info.Get(), PLUG_NAME, MB_OK);
608 IPlugAPP* pPlug = pAppHost->GetPlug();
610 bool pluginOpensHelp = pPlug->OnHostRequestingProductHelp();
612 if (pluginOpensHelp ==
false)
614 MessageBox(hwndDlg,
"See the manual", PLUG_NAME, MB_OK);
620 INT_PTR ret = DialogBox(gHINSTANCE, MAKEINTRESOURCE(IDD_DIALOG_PREF), hwndDlg, IPlugAPPHost::PreferencesDlgProc);
623 pAppHost->UpdateINI();
627#if defined _DEBUG && !defined NO_IGRAPHICS
640 CheckMenuItem(GET_MENU(), ID_LIVE_EDIT, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
658 CheckMenuItem(GET_MENU(), ID_SHOW_DRAWN, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
676 CheckMenuItem(GET_MENU(), ID_SHOW_BOUNDS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
694 CheckMenuItem(GET_MENU(), ID_SHOW_FPS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
703 case WM_GETMINMAXINFO:
708 IPlugAPP* pPlug = pAppHost->GetPlug();
710 MINMAXINFO* mmi = (MINMAXINFO*) lParam;
711 mmi->ptMinTrackSize.x = pPlug->GetMinWidth();
712 mmi->ptMinTrackSize.y = pPlug->GetMinHeight();
713 mmi->ptMaxTrackSize.x = pPlug->GetMaxWidth();
714 mmi->ptMaxTrackSize.y = pPlug->GetMaxHeight();
717 float scale = GetScaleForHWND(hwndDlg);
718 mmi->ptMinTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.x) * scale);
719 mmi->ptMinTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.y) * scale);
720 mmi->ptMaxTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.x) * scale);
721 mmi->ptMaxTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.y) * scale);
729 WORD dpi = HIWORD(wParam);
730 RECT* rect = (RECT*)lParam;
731 float scale = GetScaleForHWND(hwndDlg);
737 GetClientRect(hwndDlg, &rcClient);
738 GetWindowRect(hwndDlg, &rcWindow);
740 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
741 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
762 SetWindowPos(hwndDlg, 0, rect->left, rect->top, w + ptDiff.x, h + ptDiff.y, 0);
769 IPlugAPP* pPlug = pAppHost->GetPlug();
771 switch (LOWORD(wParam))
777 GetClientRect(hwndDlg, &r);
780 scale = GetScaleForHWND(hwndDlg);
782 pPlug->OnParentWindowResize(
static_cast<int>(r.right / scale),
static_cast<int>(r.bottom / scale));
This pure virtual interface delegates communication in both directions between a UI editor and someth...
int GetEditorHeight() const
int GetEditorWidth() const
An editor delegate base class for a SOMETHING that uses IGraphics for it's UI.
IGraphics * GetUI()
Get a pointer to the IGraphics context.
The lowest level base class of an IGraphics context.
void ShowControlBounds(bool enable)
void EnableLiveEdit(bool enable)
Live edit mode allows you to relocate controls at runtime in debug builds.
bool ShowAreaDrawnEnabled() const
bool LiveEditEnabled() const
bool ShowControlBoundsEnabled() const
void ShowFPSDisplay(bool enable)
Shows a control to display the frame rate of drawing.
void ShowAreaDrawn(bool enable)
void SetScreenScale(float scale)
Called by the platform IGraphics class when moving to a new screen to set DPI.
A class that hosts an IPlug as a standalone app and provides Audio/Midi I/O.
void ProbeAudioIO()
find out which devices have input channels & which have output channels, add their ids to the lists
std::string GetAudioDeviceName(int idx) const
Returns the name of the audio device at idx.
Standalone application base class for an IPlug plug-in.