11#include "IPlugAPP_host.h"
17extern float GetScaleForHWND(HWND hWnd);
18#define GET_MENU() GetMenu(gHWND)
20#define GET_MENU() SWELL_GetCurrentMenu()
25#if !defined NO_IGRAPHICS
27using namespace igraphics;
32void IPlugAPPHost::PopulateSampleRateList(HWND hwndDlg, RtAudio::DeviceInfo* inputDevInfo, RtAudio::DeviceInfo* outputDevInfo)
36 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_RESETCONTENT,0,0);
38 std::vector<int> matchedSRs;
40 if (inputDevInfo->probed && outputDevInfo->probed)
42 for (
int i=0; i<inputDevInfo->sampleRates.size(); i++)
44 for (
int j=0; j<outputDevInfo->sampleRates.size(); j++)
46 if(inputDevInfo->sampleRates[i] == outputDevInfo->sampleRates[j])
47 matchedSRs.push_back(inputDevInfo->sampleRates[i]);
52 for (
int k=0; k<matchedSRs.size(); k++)
54 buf.SetFormatted(20,
"%i", matchedSRs[k]);
55 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_ADDSTRING,0,(LPARAM)buf.Get());
56 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_SR,CB_SETITEMDATA,k,(LPARAM)matchedSRs[k]);
60 str.SetFormatted(32,
"%i", mState.mAudioSR);
62 LRESULT sridx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
63 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_SETCURSEL, sridx, 0);
66void IPlugAPPHost::PopulateAudioInputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
73 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_RESETCONTENT,0,0);
74 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_RESETCONTENT,0,0);
78 for (i=0; i<info->inputChannels -1; i++)
80 buf.SetFormatted(20,
"%i", i+1);
81 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
82 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
86 buf.SetFormatted(20,
"%i", i+1);
87 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
89 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_L,CB_SETCURSEL, mState.mAudioInChanL - 1, 0);
90 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
93void IPlugAPPHost::PopulateAudioOutputList(HWND hwndDlg, RtAudio::DeviceInfo* info)
100 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_RESETCONTENT,0,0);
101 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_RESETCONTENT,0,0);
105 for (i=0; i<info->outputChannels -1; i++)
107 buf.SetFormatted(20,
"%i", i+1);
108 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_ADDSTRING,0,(LPARAM)buf.Get());
109 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
113 buf.SetFormatted(20,
"%i", i+1);
114 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_ADDSTRING,0,(LPARAM)buf.Get());
116 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_L,CB_SETCURSEL, mState.mAudioOutChanL - 1, 0);
117 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
121void IPlugAPPHost::PopulateDriverSpecificControls(HWND hwndDlg)
124 int driverType = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
125 if(driverType == kDeviceASIO)
127 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), FALSE);
128 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), TRUE);
132 ComboBox_Enable(GetDlgItem(hwndDlg, IDC_COMBO_AUDIO_IN_DEV), TRUE);
133 Button_Enable(GetDlgItem(hwndDlg, IDC_BUTTON_OS_DEV_SETTINGS), FALSE);
140 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_RESETCONTENT,0,0);
141 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_RESETCONTENT,0,0);
143 for (
int i = 0; i<mAudioInputDevs.size(); i++)
145 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioInputDevs[i]).c_str());
151 for (
int i = 0; i<mAudioOutputDevs.size(); i++)
153 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_ADDSTRING,0,(LPARAM)
GetAudioDeviceName(mAudioOutputDevs[i]).c_str());
155 if(!strcmp(
GetAudioDeviceName(mAudioOutputDevs[i]).c_str(), mState.mAudioOutDev.Get()))
160 if(driverType == kDeviceASIO)
161 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, outdevidx, 0);
164 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_DEV,CB_SETCURSEL, indevidx, 0);
166 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
168 RtAudio::DeviceInfo inputDevInfo;
169 RtAudio::DeviceInfo outputDevInfo;
171 if (mAudioInputDevs.size())
173 inputDevInfo = mDAC->getDeviceInfo(mAudioInputDevs[indevidx]);
174 PopulateAudioInputList(hwndDlg, &inputDevInfo);
177 if (mAudioOutputDevs.size())
179 outputDevInfo = mDAC->getDeviceInfo(mAudioOutputDevs[outdevidx]);
180 PopulateAudioOutputList(hwndDlg, &outputDevInfo);
183 PopulateSampleRateList(hwndDlg, &inputDevInfo, &outputDevInfo);
186void IPlugAPPHost::PopulateAudioDialogs(HWND hwndDlg)
188 PopulateDriverSpecificControls(hwndDlg);
200 for (
int i = 0; i< kNumBufferSizeOptions; i++)
202 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_BUF_SIZE,CB_ADDSTRING,0,(LPARAM)kBufferSizeOptions[i].c_str());
206 str.SetFormatted(32,
"%i", mState.mBufferSize);
208 LRESULT iovsidx = SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_FINDSTRINGEXACT, -1, (LPARAM) str.Get());
209 SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_SETCURSEL, iovsidx, 0);
212bool IPlugAPPHost::PopulateMidiDialogs(HWND hwndDlg)
214 if ( !mMidiIn || !mMidiOut )
218 for (
int i=0; i<mMidiInputDevNames.size(); i++ )
220 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_ADDSTRING,0,(LPARAM)mMidiInputDevNames[i].c_str());
223 LRESULT indevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiInDev.Get());
228 mState.mMidiInDev.Set(
"off");
233 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_DEV,CB_SETCURSEL, indevidx, 0);
235 for (
int i=0; i<mMidiOutputDevNames.size(); i++ )
237 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_ADDSTRING,0,(LPARAM)mMidiOutputDevNames[i].c_str());
240 LRESULT outdevidx = SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_FINDSTRINGEXACT, -1, (LPARAM)mState.mMidiOutDev.Get());
245 mState.mMidiOutDev.Set(
"off");
250 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_DEV,CB_SETCURSEL, outdevidx, 0);
254 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
255 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)
"all");
259 for (
int i=0; i<16; i++)
261 buf.SetFormatted(20,
"%i", i+1);
262 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
263 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_ADDSTRING,0,(LPARAM)buf.Get());
266 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_IN_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiInChan, 0);
267 SendDlgItemMessage(hwndDlg,IDC_COMBO_MIDI_OUT_CHAN,CB_SETCURSEL, (LPARAM)mState.mMidiOutChan, 0);
274void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
276 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"DirectSound");
277 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"ASIO");
278 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
280 PopulateAudioDialogs(hwndDlg);
281 PopulateMidiDialogs(hwndDlg);
285void IPlugAPPHost::PopulatePreferencesDialog(HWND hwndDlg)
287 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_ADDSTRING,0,(LPARAM)
"CoreAudio");
289 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_DRIVER,CB_SETCURSEL, mState.mAudioDriverType, 0);
291 PopulateAudioDialogs(hwndDlg);
292 PopulateMidiDialogs(hwndDlg);
295 #error NOT IMPLEMENTED
298WDL_DLGRET IPlugAPPHost::PreferencesDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
301 AppState& mState = _this->mState;
302 AppState& mTempState = _this->mTempState;
303 AppState& mActiveState = _this->mActiveState;
305 auto getComboString = [&](WDL_String& str,
int item, WPARAM idx) {
306 std::string tempString;
307 long len = (long) SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXTLEN, idx, 0) + 1;
308 tempString.reserve(len);
309 SendDlgItemMessage(hwndDlg, item, CB_GETLBTEXT, idx, (LPARAM) tempString.data());
310 str.Set(tempString.c_str());
317 _this->PopulatePreferencesDialog(hwndDlg);
323 switch (LOWORD(wParam))
326 if(mActiveState != mState)
327 _this->TryToChangeAudio();
329 EndDialog(hwndDlg, IDOK);
332 _this->TryToChangeAudio();
335 EndDialog(hwndDlg, IDCANCEL);
338 if (!_this->AudioSettingsInStateAreEqual(mState, mTempState)
339 || !_this->MIDISettingsInStateAreEqual(mState, mTempState))
343 _this->TryToChangeAudioDriverType();
345 _this->TryToChangeAudio();
350 case IDC_COMBO_AUDIO_DRIVER:
351 if (HIWORD(wParam) == CBN_SELCHANGE)
353 v = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_DRIVER, CB_GETCURSEL, 0, 0);
355 if(v != mState.mAudioDriverType)
357 mState.mAudioDriverType = v;
359 _this->TryToChangeAudioDriverType();
362 if (_this->mAudioInputDevs.size())
365 if (_this->mAudioOutputDevs.size())
366 mState.mAudioOutDev.Set(_this->
GetAudioDeviceName(_this->mAudioOutputDevs[0]).c_str());
369 mState.mAudioOutChanL = 1;
370 mState.mAudioOutChanR = 2;
372 _this->PopulateAudioDialogs(hwndDlg);
377 case IDC_COMBO_AUDIO_IN_DEV:
378 if (HIWORD(wParam) == CBN_SELCHANGE)
380 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_DEV, CB_GETCURSEL, 0, 0);
381 getComboString(mState.mAudioInDev, IDC_COMBO_AUDIO_IN_DEV, idx);
384 mState.mAudioInChanL = 1;
385 mState.mAudioInChanR = 2;
387 _this->PopulateDriverSpecificControls(hwndDlg);
391 case IDC_COMBO_AUDIO_OUT_DEV:
392 if (HIWORD(wParam) == CBN_SELCHANGE)
394 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_DEV, CB_GETCURSEL, 0, 0);
395 getComboString(mState.mAudioOutDev, IDC_COMBO_AUDIO_OUT_DEV, idx);
398 mState.mAudioOutChanL = 1;
399 mState.mAudioOutChanR = 2;
401 _this->PopulateDriverSpecificControls(hwndDlg);
405 case IDC_COMBO_AUDIO_IN_L:
406 if (HIWORD(wParam) == CBN_SELCHANGE)
408 mState.mAudioInChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_L, CB_GETCURSEL, 0, 0) + 1;
411 mState.mAudioInChanR = mState.mAudioInChanL + 1;
412 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
417 case IDC_COMBO_AUDIO_IN_R:
418 if (HIWORD(wParam) == CBN_SELCHANGE)
419 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_IN_R,CB_SETCURSEL, mState.mAudioInChanR - 1, 0);
420 mState.mAudioInChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_IN_R, CB_GETCURSEL, 0, 0);
423 case IDC_COMBO_AUDIO_OUT_L:
424 if (HIWORD(wParam) == CBN_SELCHANGE)
426 mState.mAudioOutChanL = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_L, CB_GETCURSEL, 0, 0) + 1;
429 mState.mAudioOutChanR = mState.mAudioOutChanL + 1;
430 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
435 case IDC_COMBO_AUDIO_OUT_R:
436 if (HIWORD(wParam) == CBN_SELCHANGE)
437 SendDlgItemMessage(hwndDlg,IDC_COMBO_AUDIO_OUT_R,CB_SETCURSEL, mState.mAudioOutChanR - 1, 0);
438 mState.mAudioOutChanR = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_OUT_R, CB_GETCURSEL, 0, 0);
448 case IDC_COMBO_AUDIO_BUF_SIZE:
449 if (HIWORD(wParam) == CBN_SELCHANGE)
451 int iovsidx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_BUF_SIZE, CB_GETCURSEL, 0, 0);
452 mState.mBufferSize = atoi(kBufferSizeOptions[iovsidx].c_str());
455 case IDC_COMBO_AUDIO_SR:
456 if (HIWORD(wParam) == CBN_SELCHANGE)
458 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETCURSEL, 0, 0);
459 mState.mAudioSR = (uint32_t) SendDlgItemMessage(hwndDlg, IDC_COMBO_AUDIO_SR, CB_GETITEMDATA, idx, 0);
463 case IDC_BUTTON_OS_DEV_SETTINGS:
464 if (HIWORD(wParam) == BN_CLICKED) {
466 if( (_this->mState.mAudioDriverType == kDeviceASIO) && (_this->mDAC->isStreamRunning() ==
true))
469 if(SWELL_GetOSXVersion() >= 0x1200) {
470 system(
"open \"/System/Applications/Utilities/Audio MIDI Setup.app\"");
472 system(
"open \"/Applications/Utilities/Audio MIDI Setup.app\"");
475 #error NOT IMPLEMENTED
480 case IDC_COMBO_MIDI_IN_DEV:
481 if (HIWORD(wParam) == CBN_SELCHANGE)
483 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_DEV, CB_GETCURSEL, 0, 0);
484 getComboString(mState.mMidiInDev, IDC_COMBO_MIDI_IN_DEV, idx);
485 _this->SelectMIDIDevice(ERoute::kInput, mState.mMidiInDev.Get());
489 case IDC_COMBO_MIDI_OUT_DEV:
490 if (HIWORD(wParam) == CBN_SELCHANGE)
492 int idx = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_DEV, CB_GETCURSEL, 0, 0);
493 getComboString(mState.mMidiOutDev, IDC_COMBO_MIDI_OUT_DEV, idx);
494 _this->SelectMIDIDevice(ERoute::kOutput, mState.mMidiOutDev.Get());
498 case IDC_COMBO_MIDI_IN_CHAN:
499 if (HIWORD(wParam) == CBN_SELCHANGE)
500 mState.mMidiInChan = (int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_IN_CHAN, CB_GETCURSEL, 0, 0);
503 case IDC_COMBO_MIDI_OUT_CHAN:
504 if (HIWORD(wParam) == CBN_SELCHANGE)
505 mState.mMidiOutChan = (
int) SendDlgItemMessage(hwndDlg, IDC_COMBO_MIDI_OUT_CHAN, CB_GETCURSEL, 0, 0);
518static void ClientResize(HWND hWnd,
int width,
int height)
520 RECT rcClient, rcWindow;
522 int screenwidth, screenheight;
525 screenwidth = GetSystemMetrics(SM_CXSCREEN);
526 screenheight = GetSystemMetrics(SM_CYSCREEN);
527 x = (screenwidth / 2) - (width / 2);
528 y = (screenheight / 2) - (height / 2);
530 GetClientRect(hWnd, &rcClient);
531 GetWindowRect(hWnd, &rcWindow);
533 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
534 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
536 SetWindowPos(hWnd, 0, x, y, width + ptDiff.x, height + ptDiff.y, 0);
540WDL_DLGRET IPlugAPPHost::MainDlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
549 IPlugAPP* pPlug = pAppHost->GetPlug();
551 if (!pAppHost->OpenWindow(gHWND))
553 DBGMSG(
"couldn't attach gui\n");
556 ClientResize(hwndDlg, pPlug->GetEditorWidth(), pPlug->GetEditorHeight());
558 ShowWindow(hwndDlg, SW_SHOW);
562 pAppHost->CloseWindow();
564 IPlugAPPHost::sInstance =
nullptr;
569 SWELL_PostQuitMessage(hwndDlg);
574 DestroyWindow(hwndDlg);
577 switch (LOWORD(wParam))
581 DestroyWindow(hwndDlg);
586 IPlugAPP* pPlug = pAppHost->GetPlug();
588 bool pluginOpensAboutBox = pPlug->OnHostRequestingAboutBox();
590 if (pluginOpensAboutBox ==
false)
593 info.Append(PLUG_COPYRIGHT_STR
"\nBuilt on " __DATE__);
594 MessageBox(hwndDlg, info.Get(), PLUG_NAME, MB_OK);
601 IPlugAPP* pPlug = pAppHost->GetPlug();
603 bool pluginOpensHelp = pPlug->OnHostRequestingProductHelp();
605 if (pluginOpensHelp ==
false)
607 MessageBox(hwndDlg,
"See the manual", PLUG_NAME, MB_OK);
613 INT_PTR ret = DialogBox(gHINSTANCE, MAKEINTRESOURCE(IDD_DIALOG_PREF), hwndDlg, IPlugAPPHost::PreferencesDlgProc);
616 pAppHost->UpdateINI();
620#if defined _DEBUG && !defined NO_IGRAPHICS
633 CheckMenuItem(GET_MENU(), ID_LIVE_EDIT, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
651 CheckMenuItem(GET_MENU(), ID_SHOW_DRAWN, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
669 CheckMenuItem(GET_MENU(), ID_SHOW_BOUNDS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
687 CheckMenuItem(GET_MENU(), ID_SHOW_FPS, (MF_BYCOMMAND | enabled) ? MF_UNCHECKED : MF_CHECKED);
696 case WM_GETMINMAXINFO:
701 IPlugAPP* pPlug = pAppHost->GetPlug();
703 MINMAXINFO* mmi = (MINMAXINFO*) lParam;
704 mmi->ptMinTrackSize.x = pPlug->GetMinWidth();
705 mmi->ptMinTrackSize.y = pPlug->GetMinHeight();
706 mmi->ptMaxTrackSize.x = pPlug->GetMaxWidth();
707 mmi->ptMaxTrackSize.y = pPlug->GetMaxHeight();
710 float scale = GetScaleForHWND(hwndDlg);
711 mmi->ptMinTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.x) * scale);
712 mmi->ptMinTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMinTrackSize.y) * scale);
713 mmi->ptMaxTrackSize.x =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.x) * scale);
714 mmi->ptMaxTrackSize.y =
static_cast<LONG
>(
static_cast<float>(mmi->ptMaxTrackSize.y) * scale);
722 WORD dpi = HIWORD(wParam);
723 RECT* rect = (RECT*)lParam;
724 float scale = GetScaleForHWND(hwndDlg);
730 GetClientRect(hwndDlg, &rcClient);
731 GetWindowRect(hwndDlg, &rcWindow);
733 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
734 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
755 SetWindowPos(hwndDlg, 0, rect->left, rect->top, w + ptDiff.x, h + ptDiff.y, 0);
762 IPlugAPP* pPlug = pAppHost->GetPlug();
764 switch (LOWORD(wParam))
772 GetClientRect(hwndDlg, &r);
773 pPlug->OnParentWindowResize(
static_cast<int>(r.right),
static_cast<int>(r.bottom));
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 that uses IGraphics for the 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.
bool GetHostResizeEnabled() const