11 #include "IPlugAPP_host.h" 17 #define GET_MENU() GetMenu(gHWND) 19 #define GET_MENU() SWELL_GetCurrentMenu() 22 using namespace iplug;
24 #if !defined NO_IGRAPHICS 26 using namespace igraphics;
30 extern int GetTitleBarOffset();
34 void IPlugAPPHost::PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* inputDevInfo, RtAudio::DeviceInfo* outputDevInfo)
38 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_RESETCONTENT,0,0);
40 std::vector<int> matchedSRs;
42 if (inputDevInfo->probed && outputDevInfo->probed)
44 for (
int i=0; i<inputDevInfo->sampleRates.size(); i++)
46 for (
int j=0; j<outputDevInfo->sampleRates.size(); j++)
48 if(inputDevInfo->sampleRates[i] == outputDevInfo->sampleRates[j])
49 matchedSRs.push_back(inputDevInfo->sampleRates[i]);
54 for (
int k=0; k<matchedSRs.size(); k++)
56 buf.SetFormatted(20,
"%i", matchedSRs[k]);
57 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_ADDSTRING,0,(LPARAM)buf.Get());
58 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_SETITEMDATA,k,(LPARAM)matchedSRs[k]);
62 str.SetFormatted(32,
"%i", mState.mAudioSR);
64 LRESULT sridx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
65 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_SETCURSEL, sridx, 0);
68 void IPlugAPPHost::PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
75 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_RESETCONTENT,0,0);
76 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_RESETCONTENT,0,0);
80 for (i=0; i<info->inputChannels -1; i++)
82 buf.SetFormatted(20,
"%i", i+1);
83 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
84 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
88 buf.SetFormatted(20,
"%i", i+1);
89 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
91 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_SETCURSEL, mState.mAudioInChanL - 1, 0);
92 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
95 void IPlugAPPHost::PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
102 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_RESETCONTENT,0,0);
103 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_RESETCONTENT,0,0);
107 for (i=0; i<info->outputChannels -1; i++)
109 buf.SetFormatted(20,
"%i", i+1);
110 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
111 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
115 buf.SetFormatted(20,
"%i", i+1);
116 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
118 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_SETCURSEL, mState.mAudioOutChanL - 1, 0);
119 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
123 void IPlugAPPHost::PopulateDriverSpecificControls(HWND hwndDlg)
126 int driverType = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
127 if(driverType == kDeviceASIO)
129 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), FALSE);
130 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), TRUE);
134 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), TRUE);
135 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), FALSE);
142 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_RESETCONTENT,0,0);
143 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_RESETCONTENT,0,0);
145 for (
int i = 0; i<mAudioInputDevs.size(); i++)
147 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioInputDevs[i]).c_str());
153 for (
int i = 0; i<mAudioOutputDevs.size(); i++)
155 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioOutputDevs[i]).c_str());
157 if(!strcmp(
GetAudioDeviceName(mAudioOutputDevs[i]).c_str(), mState.mAudioOutDev.Get()))
162 if(driverType == kDeviceASIO)
163 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, outdevidx, 0);
166 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, indevidx, 0);
168 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
170 RtAudio::DeviceInfo inputDevInfo;
171 RtAudio::DeviceInfo outputDevInfo;
173 if (mAudioInputDevs.size())
175 inputDevInfo = mDAC->getDeviceInfo(mAudioInputDevs[indevidx]);
176 PopulateAudioInputList(hwndDlg, &inputDevInfo);
179 if (mAudioOutputDevs.size())
181 outputDevInfo = mDAC->getDeviceInfo(mAudioOutputDevs[outdevidx]);
182 PopulateAudioOutputList(hwndDlg, &outputDevInfo);
185 PopulateSampleRateList(hwndDlg, &inputDevInfo, &outputDevInfo);
188 void IPlugAPPHost::PopulateAudioDialogs(HWND hwndDlg)
190 PopulateDriverSpecificControls(hwndDlg);
202 for (
int i = 0; i< kNumBufferSizeOptions; i++)
204 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_BUF_SIZE,CB_ADDSTRING,0,(LPARAM)kBufferSizeOptions[i].c_str());
208 str.SetFormatted(32,
"%i", mState.mBufferSize);
210 LRESULT iovsidx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
211 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_SETCURSEL, iovsidx, 0);
214 bool IPlugAPPHost::PopulateMidiDialogs(HWND hwndDlg)
216 if ( !mMidiIn || !mMidiOut )
220 for (
int i=0; i<mMidiInputDevNames.size(); i++ )
222 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_ADDSTRING,0,(LPARAM)mMidiInputDevNames[i].c_str());
225 LRESULT indevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiInDev.Get());
230 mState.mMidiInDev.Set(
"off");
235 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_SETCURSEL, indevidx, 0);
237 for (
int i=0; i<mMidiOutputDevNames.size(); i++ )
239 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_ADDSTRING,0,(LPARAM)mMidiOutputDevNames[i].c_str());
242 LRESULT outdevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiOutDev.Get());
247 mState.mMidiOutDev.Set(
"off");
252 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
256 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
257 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
261 for (
int i=0; i<16; i++)
263 buf.SetFormatted(20,
"%i", i+1);
264 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
265 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
268 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiInChan, 0);
269 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiOutChan, 0);
276 void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
278 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"DirectSound");
279 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"ASIO");
280 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
282 PopulateAudioDialogs(hwndDlg);
283 PopulateMidiDialogs(hwndDlg);
287 void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
289 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"CoreAudio");
291 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
293 PopulateAudioDialogs(hwndDlg);
294 PopulateMidiDialogs(hwndDlg);
297 #error NOT IMPLEMENTED 300 WDL_DLGRET IPlugAPPHost::PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
303 AppState& mState = _this->mState;
304 AppState& mTempState = _this->mTempState;
305 AppState& mActiveState = _this->mActiveState;
307 auto getComboString = [&](WDL_String& str,
int item, WPARAM idx) {
308 std::string tempString;
309 long len = (long) SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXTLEN, idx, 0) + 1;
310 tempString.reserve(len);
311 SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXT, idx, (LPARAM) tempString.data());
312 str.Set(tempString.c_str());
319 _this->PopulatePreferencesDialog(hwndDlg);
325 switch (LOWORD(wParam))
328 if(mActiveState != mState)
329 _this->TryToChangeAudio();
331 EndDialog(hwndDlg, IDOK);
334 _this->TryToChangeAudio();
337 EndDialog(hwndDlg, IDCANCEL);
340 if (!_this->AudioSettingsInStateAreEqual(mState, mTempState)
341 || !_this->MIDISettingsInStateAreEqual(mState, mTempState))
345 _this->TryToChangeAudioDriverType();
347 _this->TryToChangeAudio();
352 case IDC_COMBO_AUDIO_DRIVER:
353 if (HIWORD(wParam) == CBN_SELCHANGE)
355 v = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
357 if(v != mState.mAudioDriverType)
359 mState.mAudioDriverType = v;
361 _this->TryToChangeAudioDriverType();
364 if (_this->mAudioInputDevs.size())
367 if (_this->mAudioOutputDevs.size())
368 mState.mAudioOutDev.Set(_this->
GetAudioDeviceName(_this->mAudioOutputDevs[0]).c_str());
371 mState.mAudioOutChanL = 1;
372 mState.mAudioOutChanR = 2;
374 _this->PopulateAudioDialogs(hwndDlg);
379 case IDC_COMBO_AUDIO_IN_DEV:
380 if (HIWORD(wParam) == CBN_SELCHANGE)
382 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_DEV, CB_GETCURSEL, 0, 0);
383 getComboString(mState.mAudioInDev, IDC_COMBO_AUDIO_IN_DEV, idx);
386 mState.mAudioInChanL = 1;
387 mState.mAudioInChanR = 2;
389 _this->PopulateDriverSpecificControls(hwndDlg);
393 case IDC_COMBO_AUDIO_OUT_DEV:
394 if (HIWORD(wParam) == CBN_SELCHANGE)
396 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_DEV, CB_GETCURSEL, 0, 0);
397 getComboString(mState.mAudioOutDev, IDC_COMBO_AUDIO_OUT_DEV, idx);
400 mState.mAudioOutChanL = 1;
401 mState.mAudioOutChanR = 2;
403 _this->PopulateDriverSpecificControls(hwndDlg);
407 case IDC_COMBO_AUDIO_IN_L:
408 if (HIWORD(wParam) == CBN_SELCHANGE)
410 mState.mAudioInChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_L, CB_GETCURSEL, 0, 0) + 1;
413 mState.mAudioInChanR = mState.mAudioInChanL + 1;
414 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
419 case IDC_COMBO_AUDIO_IN_R:
420 if (HIWORD(wParam) == CBN_SELCHANGE)
421 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
422 mState.mAudioInChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_R, CB_GETCURSEL, 0, 0);
425 case IDC_COMBO_AUDIO_OUT_L:
426 if (HIWORD(wParam) == CBN_SELCHANGE)
428 mState.mAudioOutChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_L, CB_GETCURSEL, 0, 0) + 1;
431 mState.mAudioOutChanR = mState.mAudioOutChanL + 1;
432 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
437 case IDC_COMBO_AUDIO_OUT_R:
438 if (HIWORD(wParam) == CBN_SELCHANGE)
439 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
440 mState.mAudioOutChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_R, CB_GETCURSEL, 0, 0);
450 case IDC_COMBO_AUDIO_BUF_SIZE:
451 if (HIWORD(wParam) == CBN_SELCHANGE)
453 int iovsidx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_GETCURSEL, 0, 0);
454 mState.mBufferSize = atoi(kBufferSizeOptions[iovsidx].c_str());
457 case IDC_COMBO_AUDIO_SR:
458 if (HIWORD(wParam) == CBN_SELCHANGE)
460 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETCURSEL, 0, 0);
461 mState.mAudioSR = (uint32_t) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETITEMDATA, idx, 0);
465 case IDC_BUTTON_OS_DEV_SETTINGS:
466 if (HIWORD(wParam) == BN_CLICKED)
468 if( (_this->mState.mAudioDriverType == kDeviceASIO) && (_this->mDAC->isStreamRunning() ==
true))
471 system(
"open \"/Applications/Utilities/Audio MIDI Setup.app\"");
473 #error NOT IMPLEMENTED 477 case IDC_COMBO_MIDI_IN_DEV:
478 if (HIWORD(wParam) == CBN_SELCHANGE)
480 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_DEV, CB_GETCURSEL, 0, 0);
481 getComboString(mState.mMidiInDev, IDC_COMBO_MIDI_IN_DEV, idx);
482 _this->SelectMIDIDevice(ERoute::kInput, mState.mMidiInDev.Get());
486 case IDC_COMBO_MIDI_OUT_DEV:
487 if (HIWORD(wParam) == CBN_SELCHANGE)
489 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_DEV, CB_GETCURSEL, 0, 0);
490 getComboString(mState.mMidiOutDev, IDC_COMBO_MIDI_OUT_DEV, idx);
491 _this->SelectMIDIDevice(ERoute::kOutput, mState.mMidiOutDev.Get());
495 case IDC_COMBO_MIDI_IN_CHAN:
496 if (HIWORD(wParam) == CBN_SELCHANGE)
497 mState.mMidiInChan = (
int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_CHAN, CB_GETCURSEL, 0, 0);
500 case IDC_COMBO_MIDI_OUT_CHAN:
501 if (HIWORD(wParam) == CBN_SELCHANGE)
502 mState.mMidiOutChan = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_CHAN, CB_GETCURSEL, 0, 0);
515 static void ClientResize(HWND hWnd,
int nWidth,
int nHeight)
517 RECT rcClient, rcWindow;
519 int screenwidth, screenheight;
522 screenwidth = GetSystemMetrics(SM_CXSCREEN);
523 screenheight = GetSystemMetrics(SM_CYSCREEN);
524 x = (screenwidth / 2) - (nWidth / 2);
525 y = (screenheight / 2) - (nHeight / 2);
527 GetClientRect(hWnd, &rcClient);
528 GetWindowRect(hWnd, &rcWindow);
530 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
531 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
533 SetWindowPos(hWnd, 0, x, y, nWidth + ptDiff.x, nHeight + ptDiff.y, 0);
537 extern float GetScaleForHWND(HWND hWnd);
541 WDL_DLGRET IPlugAPPHost::MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
553 IPlugAPP* pPlug = pAppHost->GetPlug();
555 if (!pAppHost->OpenWindow(gHWND))
556 DBGMSG(
"couldn't attach gui\n");
558 width = pPlug->GetEditorWidth();
559 height = pPlug->GetEditorHeight();
561 ClientResize(hwndDlg, width, height);
563 ShowWindow(hwndDlg, SW_SHOW);
567 pAppHost->CloseWindow();
569 IPlugAPPHost::sInstance =
nullptr;
574 SWELL_PostQuitMessage(hwndDlg);
579 DestroyWindow(hwndDlg);
582 switch (LOWORD(wParam))
586 DestroyWindow(hwndDlg);
591 IPlugAPP* pPlug = pAppHost->GetPlug();
593 bool pluginOpensAboutBox = pPlug->OnHostRequestingAboutBox();
595 if (pluginOpensAboutBox ==
false)
598 info.Append(PLUG_COPYRIGHT_STR
"\nBuilt on " __DATE__);
599 MessageBox(hwndDlg, info.Get(), PLUG_NAME, MB_OK);
606 IPlugAPP* pPlug = pAppHost->GetPlug();
608 bool pluginOpensHelp = pPlug->OnHostRequestingProductHelp();
610 if (pluginOpensHelp ==
false)
612 MessageBox(hwndDlg,
"See the manual", PLUG_NAME, MB_OK);
618 INT_PTR ret = DialogBox(gHINSTANCE, MAKEINTRESOURCE(IDD_DIALOG_PREF), hwndDlg, IPlugAPPHost::PreferencesDlgProc);
621 pAppHost->UpdateINI();
625 #if defined _DEBUG && !defined NO_IGRAPHICS 638 CheckMenuItem(GET_MENU(), ID_LIVE_EDIT, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
656 CheckMenuItem(GET_MENU(), ID_SHOW_DRAWN, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
674 CheckMenuItem(GET_MENU(), ID_SHOW_BOUNDS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
692 CheckMenuItem(GET_MENU(), ID_SHOW_FPS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
701 case WM_GETMINMAXINFO:
706 IPlugAPP* pPlug = pAppHost->GetPlug();
708 MINMAXINFO* mmi = (MINMAXINFO*) lParam;
709 mmi->ptMinTrackSize.x = pPlug->GetMinWidth();
710 mmi->ptMinTrackSize.y = pPlug->GetMinHeight();
711 mmi->ptMaxTrackSize.x = pPlug->GetMaxWidth();
712 mmi->ptMaxTrackSize.y = pPlug->GetMaxHeight();
715 const int titleBarOffset = GetTitleBarOffset();
716 mmi->ptMinTrackSize.y += titleBarOffset;
717 mmi->ptMaxTrackSize.y += titleBarOffset;
721 float scale = GetScaleForHWND(hwndDlg);
722 mmi->ptMinTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.x) * scale);
723 mmi->ptMinTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.y) * scale);
724 mmi->ptMaxTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.x) * scale);
725 mmi->ptMaxTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.y) * scale);
733 WORD dpi = HIWORD(wParam);
734 RECT* rect = (RECT*)lParam;
735 float scale = GetScaleForHWND(hwndDlg);
741 GetClientRect(hwndDlg, &rcClient);
742 GetWindowRect(hwndDlg, &rcWindow);
744 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
745 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
766 SetWindowPos(hwndDlg, 0, rect->left, rect->top, w + ptDiff.x, h + ptDiff.y, 0);
773 IPlugAPP* pPlug = pAppHost->GetPlug();
775 switch (LOWORD(wParam))
781 GetClientRect(hwndDlg, &r);
784 scale = GetScaleForHWND(hwndDlg);
786 pPlug->OnParentWindowResize(static_cast<int>(r.right / scale), static_cast<int>(r.bottom / scale));
bool LiveEditEnabled() const
void ShowAreaDrawn(bool enable)
bool ShowAreaDrawnEnabled() const
std::string GetAudioDeviceName(int idx) const
Returns the name of the audio device at idx.
Standalone application base class for an IPlug plug-in.
bool ShowControlBoundsEnabled() const
void SetScreenScale(float scale)
Called by the platform IGraphics class when moving to a new screen to set DPI.
void ProbeAudioIO()
find out which devices have input channels & which have output channels, add their ids to the lists ...
The lowest level base class of an IGraphics context.
An editor delegate base class for a SOMETHING that uses IGraphics for it's UI.
void EnableLiveEdit(bool enable)
Live edit mode allows you to relocate controls at runtime in debug builds.
int GetEditorWidth() const
The lowest level base class of an IGraphics context.
This pure virtual interface delegates communication in both directions between a UI editor and someth...
void ShowFPSDisplay(bool enable)
Shows a control to display the frame rate of drawing.
void ShowControlBounds(bool enable)
int GetEditorHeight() const
A class that hosts an IPlug as a standalone app and provides Audio/Midi I/O.
IGraphics * GetUI()
Get a pointer to the IGraphics context.