#pragma once
#include "..\..\..\Interfaces\OS\OS.h"
#include "..\..\Render\Direct3D9\2D\Font.h"
#include <Windows.h>
#include <windowsx.h>
namespace Wide {
namespace Windows {
class EditBox : public Wide:: OS :: EditBox {
HWND box;
std:: unique_ptr < std:: decay < decltype( * HFONT( ) ) > :: type , decltype( & DeleteObject) > font;
Math:: AbsolutePoint curr_pos;
Math:: AbsolutePoint curr_dim;
public :
std:: wstring GetText( ) const {
std:: wstring text;
text.resize ( Edit_GetTextLength( box) + 2 ) ;
Edit_GetText( box, & text[ 0 ] , text.size ( ) ) ;
return text;
}
void SetText( std:: wstring text) {
Edit_SetText( box, text.c_str ( ) ) ;
}
Math:: AbsolutePoint GetPosition( ) const { return curr_pos; }
Math:: AbsolutePoint GetDimensions( ) const { return curr_dim; }
void SetPosition( Math:: AbsolutePoint new_pos) {
curr_pos = new_pos;
MoveWindow( box, curr_pos.x , curr_pos.y , curr_dim.x , curr_dim.y , false ) ;
}
void SetDimensions( Math:: AbsolutePoint new_dim) {
curr_dim = new_dim;
MoveWindow( box, curr_pos.x , curr_pos.y , curr_dim.x , curr_dim.y , false ) ;
}
void SetFont( std:: shared_ptr < Render:: Font > f) {
font = decltype( this- > font) ( CreateFontIndirect( & dynamic_cast < Wide:: Direct3D9 :: Font * > ( f.get ( ) ) - > GetLogFont( ) ) , & DeleteObject) ;
SendMessage( box, WM_SETFONT, reinterpret_cast < WPARAM> ( font.get ( ) ) , true ) ;
SendMessage( box, EM_SETMODIFY, true , 0 ) ;
}
EditBox( std:: shared_ptr < Render:: Font > font, HWND owner, Math:: AbsolutePoint position, Math:: AbsolutePoint dimensions, HINSTANCE hinst)
: curr_pos( position) , curr_dim( dimensions) , font( CreateFontIndirect( & dynamic_cast < Wide:: Direct3D9 :: Font * > ( font.get ( ) ) - > GetLogFont( ) ) , & DeleteObject) {
box = CreateWindowEx(
0 ,
L"EDIT" ,
L"Type here" ,
WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_LEFT,
position.x ,
position.y ,
dimensions.x ,
dimensions.y ,
owner,
0 ,
hinst,
0 ) ;
/*SetWindowSubclass(box, [](HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, UINT_PTR, DWORD_PTR) -> LRESULT {
if (msg != WM_PAINT)
return DefSubclassProc(hwnd, msg, wparam, lparam);
PAINTSTRUCT paint;
BeginPaint(hwnd, &paint);
EndPaint(hwnd, &paint);
return 0;
}, 0, 0);*/
// In principle, ES_LEFT should work, but it doesn't appear to actually want to work.
/*PARAFORMAT f;
f.cbSize = sizeof(f);
f.dwMask = PFM_ALIGNMENT;
f.wAlignment = PFA_LEFT;
CHARRANGE range;
range.cpMin = 0;
range.cpMax = -1;
SendMessage(box, EM_EXSETSEL, 0, reinterpret_cast<LPARAM>(&range));
range.cpMax = 0;
SendMessage(box, EM_SETPARAFORMAT, 0, reinterpret_cast<LPARAM>(&f));
SendMessage(box, EM_EXSETSEL, 0, reinterpret_cast<LPARAM>(&range));*/
SendMessage( box, WM_SETFONT, reinterpret_cast < WPARAM> ( font.get ( ) ) , true ) ;
SendMessage( box, EM_SETMODIFY, true , 0 ) ;
}
~EditBox( ) { DestroyWindow( box) ; }
} ;
}
}
I3ByYWdtYSBvbmNlCgojaW5jbHVkZSAiLi5cLi5cLi5cSW50ZXJmYWNlc1xPU1xPUy5oIgojaW5jbHVkZSAiLi5cLi5cUmVuZGVyXERpcmVjdDNEOVwyRFxGb250LmgiCiNpbmNsdWRlIDxXaW5kb3dzLmg+CiNpbmNsdWRlIDx3aW5kb3dzeC5oPgoKCm5hbWVzcGFjZSBXaWRlIHsKICAgIG5hbWVzcGFjZSBXaW5kb3dzIHsKICAgICAgICBjbGFzcyBFZGl0Qm94IDogcHVibGljIFdpZGU6Ok9TOjpFZGl0Qm94IHsKICAgICAgICAgICAgSFdORCBib3g7CiAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OmRlY2F5PGRlY2x0eXBlKCpIRk9OVCgpKT46OnR5cGUsIGRlY2x0eXBlKCZEZWxldGVPYmplY3QpPiBmb250OyAKICAgICAgICAgICAgTWF0aDo6QWJzb2x1dGVQb2ludCBjdXJyX3BvczsKICAgICAgICAgICAgTWF0aDo6QWJzb2x1dGVQb2ludCBjdXJyX2RpbTsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgIHN0ZDo6d3N0cmluZyBHZXRUZXh0KCkgY29uc3QgewogICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nIHRleHQ7CiAgICAgICAgICAgICAgICB0ZXh0LnJlc2l6ZShFZGl0X0dldFRleHRMZW5ndGgoYm94KSArIDIpOwogICAgICAgICAgICAgICAgRWRpdF9HZXRUZXh0KGJveCwgJnRleHRbMF0sIHRleHQuc2l6ZSgpKTsKICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0OwogICAgICAgICAgICB9CgogICAgICAgICAgICB2b2lkIFNldFRleHQoc3RkOjp3c3RyaW5nIHRleHQpIHsKICAgICAgICAgICAgICAgIEVkaXRfU2V0VGV4dChib3gsIHRleHQuY19zdHIoKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE1hdGg6OkFic29sdXRlUG9pbnQgR2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBjdXJyX3BvczsgfQogICAgICAgICAgICBNYXRoOjpBYnNvbHV0ZVBvaW50IEdldERpbWVuc2lvbnMoKSBjb25zdCB7IHJldHVybiBjdXJyX2RpbTsgfQoKICAgICAgICAgICAgdm9pZCBTZXRQb3NpdGlvbihNYXRoOjpBYnNvbHV0ZVBvaW50IG5ld19wb3MpIHsKICAgICAgICAgICAgICAgIGN1cnJfcG9zID0gbmV3X3BvczsKICAgICAgICAgICAgICAgIE1vdmVXaW5kb3coYm94LCBjdXJyX3Bvcy54LCBjdXJyX3Bvcy55LCBjdXJyX2RpbS54LCBjdXJyX2RpbS55LCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdm9pZCBTZXREaW1lbnNpb25zKE1hdGg6OkFic29sdXRlUG9pbnQgbmV3X2RpbSkgewogICAgICAgICAgICAgICAgY3Vycl9kaW0gPSBuZXdfZGltOwogICAgICAgICAgICAgICAgTW92ZVdpbmRvdyhib3gsIGN1cnJfcG9zLngsIGN1cnJfcG9zLnksIGN1cnJfZGltLngsIGN1cnJfZGltLnksIGZhbHNlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdm9pZCBTZXRGb250KHN0ZDo6c2hhcmVkX3B0cjxSZW5kZXI6OkZvbnQ+IGYpIHsKICAgICAgICAgICAgICAgIGZvbnQgPSBkZWNsdHlwZSh0aGlzLT5mb250KShDcmVhdGVGb250SW5kaXJlY3QoJmR5bmFtaWNfY2FzdDxXaWRlOjpEaXJlY3QzRDk6OkZvbnQqPihmLmdldCgpKS0+R2V0TG9nRm9udCgpKSwgJkRlbGV0ZU9iamVjdCk7CiAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZShib3gsIFdNX1NFVEZPTlQsIHJlaW50ZXJwcmV0X2Nhc3Q8V1BBUkFNPihmb250LmdldCgpKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBTZW5kTWVzc2FnZShib3gsIEVNX1NFVE1PRElGWSwgdHJ1ZSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgRWRpdEJveChzdGQ6OnNoYXJlZF9wdHI8UmVuZGVyOjpGb250PiBmb250LCBIV05EIG93bmVyLCBNYXRoOjpBYnNvbHV0ZVBvaW50IHBvc2l0aW9uLCBNYXRoOjpBYnNvbHV0ZVBvaW50IGRpbWVuc2lvbnMsIEhJTlNUQU5DRSBoaW5zdCkgCiAgICAgICAgICAgIDogY3Vycl9wb3MocG9zaXRpb24pLCBjdXJyX2RpbShkaW1lbnNpb25zKSwgZm9udChDcmVhdGVGb250SW5kaXJlY3QoJmR5bmFtaWNfY2FzdDxXaWRlOjpEaXJlY3QzRDk6OkZvbnQqPihmb250LmdldCgpKS0+R2V0TG9nRm9udCgpKSwgJkRlbGV0ZU9iamVjdCl7CiAgICAgICAgICAgICAgICBib3ggPSBDcmVhdGVXaW5kb3dFeCgKICAgICAgICAgICAgICAgICAgICAwLCAKICAgICAgICAgICAgICAgICAgICBMIkVESVQiLCAKICAgICAgICAgICAgICAgICAgICBMIlR5cGUgaGVyZSIsIAogICAgICAgICAgICAgICAgICAgIFdTX1ZJU0lCTEUgfCBXU19DSElMRCB8IFdTX1RBQlNUT1AgfCBFU19MRUZULAogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLngsCiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24ueSwKICAgICAgICAgICAgICAgICAgICBkaW1lbnNpb25zLngsCiAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9ucy55LAogICAgICAgICAgICAgICAgICAgIG93bmVyLAogICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgaGluc3QsCiAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgICAgICAvKlNldFdpbmRvd1N1YmNsYXNzKGJveCwgW10oSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdwYXJhbSwgTFBBUkFNIGxwYXJhbSwgVUlOVF9QVFIsIERXT1JEX1BUUikgLT4gTFJFU1VMVCB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZyAhPSBXTV9QQUlOVCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZlN1YmNsYXNzUHJvYyhod25kLCBtc2csIHdwYXJhbSwgbHBhcmFtKTsKICAgICAgICAgICAgICAgICAgICBQQUlOVFNUUlVDVCBwYWludDsKICAgICAgICAgICAgICAgICAgICBCZWdpblBhaW50KGh3bmQsICZwYWludCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgRW5kUGFpbnQoaHduZCwgJnBhaW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0sIDAsIDApOyovCiAgICAgICAgICAgICAgICAvLyBJbiBwcmluY2lwbGUsIEVTX0xFRlQgc2hvdWxkIHdvcmssIGJ1dCBpdCBkb2Vzbid0IGFwcGVhciB0byBhY3R1YWxseSB3YW50IHRvIHdvcmsuCiAgICAgICAgICAgICAgICAvKlBBUkFGT1JNQVQgZjsKICAgICAgICAgICAgICAgIGYuY2JTaXplID0gc2l6ZW9mKGYpOwogICAgICAgICAgICAgICAgZi5kd01hc2sgPSBQRk1fQUxJR05NRU5UOwogICAgICAgICAgICAgICAgZi53QWxpZ25tZW50ID0gUEZBX0xFRlQ7CiAgICAgICAgICAgICAgICBDSEFSUkFOR0UgcmFuZ2U7CiAgICAgICAgICAgICAgICByYW5nZS5jcE1pbiA9IDA7CiAgICAgICAgICAgICAgICByYW5nZS5jcE1heCA9IC0xOwogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoYm94LCBFTV9FWFNFVFNFTCwgMCwgcmVpbnRlcnByZXRfY2FzdDxMUEFSQU0+KCZyYW5nZSkpOwogICAgICAgICAgICAgICAgcmFuZ2UuY3BNYXggPSAwOwogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoYm94LCBFTV9TRVRQQVJBRk9STUFULCAwLCByZWludGVycHJldF9jYXN0PExQQVJBTT4oJmYpKTsKICAgICAgICAgICAgICAgIFNlbmRNZXNzYWdlKGJveCwgRU1fRVhTRVRTRUwsIDAsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBBUkFNPigmcmFuZ2UpKTsqLwogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoYm94LCBXTV9TRVRGT05ULCByZWludGVycHJldF9jYXN0PFdQQVJBTT4oZm9udC5nZXQoKSksIHRydWUpOwogICAgICAgICAgICAgICAgU2VuZE1lc3NhZ2UoYm94LCBFTV9TRVRNT0RJRlksIHRydWUsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIH5FZGl0Qm94KCkgeyBEZXN0cm95V2luZG93KGJveCk7IH0KICAgICAgICB9OwogICAgfQp9