Exemplo n.º 1
0
void CListSide::AddLineAt(int nLine)
{
	AddLine();
	int nrLines = m_Lines.size();
	for (int i = nrLines - 2; i>= nLine; i--)
	{
		HWND hWnd = m_Lines.at(i).edSecond.m_hWnd;
		int len = GetWindowTextLengthA(hWnd);
		char* str = NULL;
		if (len)
		{
			len++;
			str = new char[len];
			GetWindowTextA(hWnd, str, len);
			SetWindowTextA(hWnd, "0:00");
			hWnd = m_Lines.at(i+1).edSecond.m_hWnd;
			SetWindowTextA(hWnd, str);
			delete[] str;
		}

		
		hWnd = m_Lines.at(i).edText.m_hWnd;
		len = GetWindowTextLengthA(hWnd);
		if (len)
		{
			len++;
			str = new char[len];
			GetWindowTextA(hWnd, str, len);
			SetWindowTextA(hWnd, "");
			hWnd = m_Lines.at(i+1).edText.m_hWnd;
			SetWindowTextA(hWnd, str);
			delete[] str;
		}
	}
}
Exemplo n.º 2
0
void CIPMessage::Puts(HWND hW, int ID_EDIT, char *str)
{
	int nLen = GetWindowTextLengthA(GetDlgItem(hW, ID_EDIT));
	SendMessageA(GetDlgItem(hW, ID_EDIT), EM_SETSEL, nLen, nLen);
	SendMessageA(GetDlgItem(hW, ID_EDIT), EM_REPLACESEL, TRUE, (long)(LPCTSTR)str);
	nLen = GetWindowTextLengthA(GetDlgItem(hW, ID_EDIT));
	SendMessageA(GetDlgItem(hW, ID_EDIT), EM_SETSEL, nLen, nLen);
	SendMessageA(GetDlgItem(hW, ID_EDIT), EM_REPLACESEL, TRUE, (long)(LPCTSTR)"\r\n");
}
Exemplo n.º 3
0
		void TextInput::set_focus()
		{
			BaseWindow::set_focus();
			HWND hwnd = BaseWindow::get_handle();
			st len = GetWindowTextLengthA(hwnd);
			SendMessage(hwnd, EM_SETSEL, len, len);
		}
Exemplo n.º 4
0
BOOL CALLBACK CWindowsFunctions::CB_EnumChildProc(HWND hwnd, LPARAM lParam)
{
	int length = GetWindowTextLengthA(hwnd);

	if (length > 0)
	{
		length++; // NULL character

		char* jpn = new char[length];
	
		length = GetWindowTextA(hwnd, jpn, length);

		if (length > 0)
		{
			char className[6];
			GetClassNameA(hwnd, className, sizeof(className));

			if (strcmp(className, "Edit") != 0)
			{
				bool result = m_resources->TranslateUserInterface(jpn, m_uiBuffer, UI_BUFFER);

				if (result)
				{
					SetWindowTextA(hwnd, m_uiBuffer);
				}
			}
		}

		delete[] jpn;
	}

	return TRUE;
}
Exemplo n.º 5
0
static VOID DoSaveFile(VOID)
{
    HANDLE hFile;
    DWORD dwNumWrite;
    LPSTR pTemp;
    DWORD size;

    hFile = CreateFile(Globals.szFileName, GENERIC_WRITE, FILE_SHARE_WRITE,
                       NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hFile == INVALID_HANDLE_VALUE)
    {
        ShowLastError();
        return;
    }

    size = GetWindowTextLengthA(Globals.hEdit) + 1;
    pTemp = HeapAlloc(GetProcessHeap(), 0, size);
    if (!pTemp)
    {
	CloseHandle(hFile);
        ShowLastError();
        return;
    }
    size = GetWindowTextA(Globals.hEdit, pTemp, size);

    if (!WriteFile(hFile, pTemp, size, &dwNumWrite, NULL))
        ShowLastError();
    else
        SendMessage(Globals.hEdit, EM_SETMODIFY, FALSE, 0);

    SetEndOfFile(hFile);
    CloseHandle(hFile);
    HeapFree(GetProcessHeap(), 0, pTemp);
}
Exemplo n.º 6
0
void CListSide::RemoveLineAt(int nLine)
{
	int nrLines = m_Lines.size();
	for (int i = nLine; i < nrLines; i++)
	{
		HWND hWnd = m_Lines.at(i).edSecond.m_hWnd;
		int len = GetWindowTextLengthA(hWnd);
		char* str = NULL;
		if (len)
		{
			len++;
			str = new char[len];
			GetWindowTextA(hWnd, str, len);
			SetWindowTextA(hWnd, "");
			hWnd = m_Lines.at(i-1).edSecond.m_hWnd;
			SetWindowTextA(hWnd, str);
			delete[] str;
		}

		
		hWnd = m_Lines.at(i).edText.m_hWnd;
		len = GetWindowTextLengthA(hWnd);
		if (len)
		{
			len++;
			str = new char[len];
			GetWindowTextA(hWnd, str, len);
			SetWindowTextA(hWnd, "");
			hWnd = m_Lines.at(i-1).edText.m_hWnd;
			SetWindowTextA(hWnd, str);
			delete[] str;
		}
	}

	RemoveLine();

/*	RECT rect;
	GetWindowRect(m_Lines.back().edText.m_hWnd, &rect);
	POINT pt = {rect.right, rect.bottom};
	ScreenToClient(m_hWnd, &pt);

//	int nBottom = m_rClient.top + m_Lines.back().nIndex * m_nLineHeight + m_nLineHeight;
	UpdateScrollBar(pt.y);*/
}
Exemplo n.º 7
0
std::string GetText(HWND hWnd)
{
	size_t len = GetWindowTextLengthA(hWnd) + 1;
	if (len != 0)
	{
		char *text = (char *)alloca(len);
		len = GetWindowTextA(hWnd, text, len);
		return std::string(text, len);
	}
	return std::string();
}
Exemplo n.º 8
0
ZString Window::GetText() const
{
    int length = GetWindowTextLengthA(m_hwnd) + 1;

    if (length == 0) {
        return ZString();
    } else {
        char* pch = new char[length];
        GetWindowTextA(m_hwnd, pch, length);
        ZString str(pch);
        delete[] pch;
        return str;
    }
}
Exemplo n.º 9
0
void SendQueue::recallFailed(const TWindowData *dat, int iEntry) const
{
	int		iLen = GetWindowTextLengthA(GetDlgItem(dat->hwnd, IDC_MESSAGE));

	if(dat) {
		NotifyDeliveryFailure(dat);
		if (iLen == 0) {                    // message area is empty, so we can recall the failed message...
			SETTEXTEX stx = {ST_DEFAULT, 1200};
			if (m_jobs[iEntry].dwFlags & PREF_UNICODE)
				SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)&m_jobs[iEntry].sendBuffer[lstrlenA(m_jobs[iEntry].sendBuffer) + 1]);
			else {
				stx.codepage = (m_jobs[iEntry].dwFlags & PREF_UTF) ? CP_UTF8 : CP_ACP;
				SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETTEXTEX, (WPARAM)&stx, (LPARAM)m_jobs[iEntry].sendBuffer);
			}
			UpdateSaveAndSendButton(const_cast<TWindowData *>(dat));
			SendDlgItemMessage(dat->hwnd, IDC_MESSAGE, EM_SETSEL, (WPARAM) - 1, (LPARAM) - 1);
		}
	}
}
Exemplo n.º 10
0
VDStringA VDGetWindowTextAW32(HWND hwnd) {
	char buf[512];

	int len = GetWindowTextLengthA(hwnd);

	if (len > 511) {
		vdblock<char> tmp(len + 1);
		len = GetWindowTextA(hwnd, tmp.data(), tmp.size());

		const char *s = tmp.data();
		VDStringA text(s, s+len);
		return text;
	} else if (len > 0) {
		len = GetWindowTextA(hwnd, buf, 512);

		return VDStringA(buf, buf + len);
	}

	return VDStringA();
}
Exemplo n.º 11
0
VDStringW VDGetWindowTextW32(HWND hwnd) {
	union {
		wchar_t w[256];
		char a[512];
	} buf;

	if (VDIsWindowsNT()) {
		int len = GetWindowTextLengthW(hwnd);

		if (len > 255) {
			vdblock<wchar_t> tmp(len + 1);
			len = GetWindowTextW(hwnd, tmp.data(), tmp.size());

			VDStringW text(tmp.data(), len);
			return text;
		} else if (len > 0) {
			len = GetWindowTextW(hwnd, buf.w, 256);

			VDStringW text(buf.w, len);
			return text;
		}
	} else {
		int len = GetWindowTextLengthA(hwnd);

		if (len > 511) {
			vdblock<char> tmp(len + 1);
			len = GetWindowTextA(hwnd, tmp.data(), tmp.size());

			VDStringW text(VDTextAToW(tmp.data(), len));
			return text;
		} else if (len > 0) {
			len = GetWindowTextA(hwnd, buf.a, 512);

			VDStringW text(VDTextAToW(buf.a, len));
			return text;
		}
	}

	return VDStringW();
}
Exemplo n.º 12
0
static BOOL CALLBACK 
EnumWindowsProc(HWND Window, LPARAM lParam)
{
	BOOL Result = TRUE;
	enum_data *EnumData = (enum_data*)lParam;
	window_data_pool *Pool = EnumData->Pool;
	HWND ComboBox = EnumData->ComboBox;
	if(!GetParent(Window)) {
		LONG_PTR Style = GetWindowLongPtrA(Window, GWL_STYLE);
		if(Style & WS_VISIBLE) {
			int TextLength = GetWindowTextLengthA(Window);
			if(TextLength > 0) {
				char Buffer[256];
				if(GetWindowTextA(Window, Buffer, sizeof(Buffer))) {
					window_data *WndData = PushWindowData(Pool);
					if(WndData) {
						WndData->Style = Style;
						WndData->Window = Window;
						DWORD Pos = (DWORD)SendMessageA(ComboBox, CB_ADDSTRING, 0, (LPARAM)Buffer);
						SendMessageA(ComboBox, CB_SETITEMDATA, Pos, (LPARAM)WndData);
					}
					else {
						PRINT_ERR("Maximum window count reached.\n");
						SetLastError(ENUM_ERR_ABORTED);
						return FALSE;
					}
				}
				else {
					PRINT_ERR("Could not get window title.\n");
				}
			}
			else {
				PRINT_ERR("Could not get window text length.\n");
			}
		}
	}

	return Result;
}
Exemplo n.º 13
0
//--------------------------------------------------------------------------
bool WindowsVideoDevice::_CreateWindowFrom(VeWindow::Data* pkWindow,
	const void* pvData) noexcept
{
	VE_ASSERT(pkWindow && pvData);
	HWND hWnd = (HWND)pvData;
	VeInt32 i32TitleLen = GetWindowTextLengthA(hWnd);
	if (i32TitleLen > 0)
	{
		VeChar8* pcTitle = VeStackAlloc(VeChar8, i32TitleLen + 1);
		VE_ASSERT(pcTitle);
		i32TitleLen = GetWindowTextA(hWnd, pcTitle, i32TitleLen);
		VE_ASSERT(i32TitleLen > 0);
		pkWindow->m_kTitle = pcTitle;
		VeStackFree(pcTitle);
	}

	if (!SetupWindowData(pkWindow, hWnd, VE_FALSE))
	{
		return false;
	}

	return true;
}
Exemplo n.º 14
0
void saveActiveWindow()
{
  HWND active;
  char *name=malloc(256*sizeof(char)),*nAdded=malloc(256*sizeof(char));
  while(1)
  {
    Sleep(10);
    active=GetForegroundWindow();
    GetWindowTextA(active,name,GetWindowTextLengthA(active)+1);
    if(strcmp(name,nAdded))
    {
      if(strlen(name)>1)
      {
        fprintf(log,"\n###### %s ######\n",name);
        Flush();
      }
      strcpy(nAdded,name);
      printf("Test\n");
    }
  }
  free(name);
  free(nAdded);
}
Exemplo n.º 15
0
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static HWND hEdit1, hEdit2, hEdit3, hButton;
	static HWND hStatic1, hStatic2;
	static HWND hCheck;
	switch (msg)
	{
	case WM_CREATE:
		hStatic1 = CreateWindow(TEXT("Static"), TEXT("対象リスト"), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		hEdit1 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		SendMessage(hEdit1, EM_LIMITTEXT, 0, 0);
		hCheck = CreateWindow(TEXT("Button"), TEXT("HTMLエスケープ"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_AUTOCHECKBOX, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		hEdit3 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | ES_AUTOHSCROLL, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		hButton = CreateWindow(TEXT("Button"), TEXT(">変換>"), WS_VISIBLE | WS_CHILD | WS_TABSTOP | BS_DEFPUSHBUTTON, 0, 0, 0, 0, hWnd, (HMENU)IDOK, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		hStatic2 = CreateWindow(TEXT("Static"), TEXT("結果リスト"), WS_VISIBLE | WS_CHILD, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		hEdit2 = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""), WS_VISIBLE | WS_CHILD | WS_TABSTOP | WS_VSCROLL | WS_HSCROLL | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE | ES_READONLY, 0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		SendMessage(hEdit2, EM_LIMITTEXT, 0, 0);
		DragAcceptFiles(hWnd, TRUE);
		break;
	case WM_DROPFILES:
		{
			const HDROP hDrop = (HDROP)wParam;
			const UINT nFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
			if (nFiles == 1)
			{
				TCHAR szFileName[MAX_PATH];
				DragQueryFile(hDrop, 0, szFileName, sizeof(szFileName));
				const HANDLE hFile = CreateFile(szFileName, GENERIC_READ, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
				if (hFile != INVALID_HANDLE_VALUE)
				{
					const DWORD dwFileSize = GetFileSize(hFile, 0);
					DWORD dwReadSize;
					LPSTR lpszText = (LPSTR)GlobalAlloc(0, dwFileSize + 1);
					ReadFile(hFile, lpszText, dwFileSize, &dwReadSize, 0);
					lpszText[dwReadSize] = 0;
					SetWindowTextA(hEdit1, lpszText);
					GlobalFree(lpszText);
					CloseHandle(hFile);
				}
			}
			DragFinish(hDrop);
		}
		break;
	case WM_SIZE:
		{
			const int button_width = 128;
			const int width = (LOWORD(lParam) - button_width - 20) / 2;
			MoveWindow(hStatic1, 0, 0, width, 32, TRUE);
			MoveWindow(hEdit1, 0, 32, width, HIWORD(lParam) - 32, TRUE);
			MoveWindow(hCheck, width + 10, HIWORD(lParam) / 2 - 16 - 10 - 32, button_width, 32, TRUE);
			MoveWindow(hEdit3, width + 10, HIWORD(lParam) / 2 - 16, button_width, 32, TRUE);
			MoveWindow(hButton, width + 10, HIWORD(lParam) / 2 + 16 + 10, button_width, 32, TRUE);
			MoveWindow(hStatic2, width + button_width + 20, 0, width, 32, TRUE);
			MoveWindow(hEdit2, width + button_width + 20, 32, width, HIWORD(lParam) - 32, TRUE);
		}
		break;
	case WM_COMMAND:
		if (LOWORD(wParam) == IDOK)
		{
			EnableWindow(hButton, FALSE);
			SetWindowTextA(hEdit2, 0);
			const INT_PTR nEditLineCount1 = SendMessageA(hEdit1, EM_GETLINECOUNT, 0, 0);
			const INT_PTR bHtmlEscape = SendMessageA(hCheck, BM_GETCHECK, 0, 0);
			LPSTR lpszEdit3 = 0;
			const int nEditLenght3 = GetWindowTextLengthA(hEdit3);
			if (nEditLenght3)
			{
				lpszEdit3 = (LPSTR)GlobalAlloc(0, sizeof(CHAR) * (nEditLenght3 + 1));
				GetWindowTextA(hEdit3, lpszEdit3, nEditLenght3 + 1);
			}
			BOOL bIsFound;
			for (INT_PTR i = 0; i < nEditLineCount1; ++i)
			{
				bIsFound = FALSE;
				const INT_PTR nEditLineIndex1 = SendMessageA(hEdit1, EM_LINEINDEX, i, 0);
				const INT_PTR nEditLineLength1 = SendMessageA(hEdit1, EM_LINELENGTH, nEditLineIndex1, 0);
				if (!nEditLineLength1) continue;
				LPSTR lpszEditLine1 = (LPSTR)GlobalAlloc(0, sizeof(CHAR)* (nEditLineLength1 + 1 + 2)); // 改行文字2文字分追加
				*(WORD *)lpszEditLine1 = (WORD)nEditLineLength1;
				SendMessageA(hEdit1, EM_GETLINE, i, (LPARAM)lpszEditLine1);
				lpszEditLine1[nEditLineLength1] = 0;
				{
					const std::string target(lpszEditLine1);
					std::regex re(R"(https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+)");
					std::smatch match;
					for (auto it = target.begin(); regex_search(it, target.end(), match, re); it += match.position(0) + match.length(0))
					{
						std::string str(match.str(0));
						if (bHtmlEscape)
						{
							str = Replace(str, "&amp;", "&");
							str = Replace(str, "%3D", "=");
							str = Replace(str, "%22", "\"");
							str = Replace(str, "%20", " ");
						}
						if (!lpszEdit3 || StrStrIA(str.c_str(), lpszEdit3))
						{
							INT_PTR dwEditTextLength = SendMessageA(hEdit2, WM_GETTEXTLENGTH, 0, 0);
							SendMessageA(hEdit2, EM_SETSEL, dwEditTextLength, dwEditTextLength);
							SendMessageA(hEdit2, EM_REPLACESEL, 0, (LPARAM)str.c_str());
							SendMessageA(hEdit2, EM_REPLACESEL, 0, (LPARAM)"\r\n");
						}
					}
				}
				GlobalFree(lpszEditLine1);
			}
			if (lpszEdit3)
			{
				GlobalFree(lpszEdit3);
			}
			SendMessageA(hEdit2, EM_SETSEL, 0, -1);
			SetFocus(hEdit2);
			EnableWindow(hButton, TRUE);
		}
		break;
	case WM_CLOSE:
		DestroyWindow(hWnd);
		break;
	case WM_DESTROY:
		PostQuitMessage(0);
		break;
	default:
		return DefDlgProc(hWnd, msg, wParam, lParam);
	}
	return 0;
}
Exemplo n.º 16
0
LRESULT CALLBACK CListSide::WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch (uMsg)
	{
	case WM_KEYDOWN:
		{
			int nScrollNotify = -1;

			bool bFoundT = false, bFoundS = false;
			HWND hEdit = GetFocus();
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			deque<CListSide::LINE>::iterator I;
			for (I = pThis->m_Lines.begin(); I != pThis->m_Lines.end(); I++)
			{
				if (I->edText.m_hWnd == hEdit)
				{
					bFoundT = true;
					break;
				}
				if (I->edSecond.m_hWnd == hEdit)
				{
					bFoundS = true;
					break;
				}
			}

			switch (wParam)
			{
			case VK_SHIFT: break;
			case VK_NEXT:
				nScrollNotify = SB_PAGEDOWN; break;
			case VK_PRIOR:
				nScrollNotify = SB_PAGEUP; break;
			case VK_HOME:
				nScrollNotify = SB_TOP; break;
			case VK_END:
				nScrollNotify = SB_BOTTOM; break;
			case VK_UP:
				{	
					if (I->nIndex != 0)
					{
						if (bFoundT)
							SetFocus(pThis->m_Lines.at(I->nIndex - 1).edText.m_hWnd);
						if (bFoundS)
							SetFocus(pThis->m_Lines.at(I->nIndex - 1).edSecond.m_hWnd);
						
						RECT rect;
						GetWindowRect(pThis->m_Lines[I->nIndex-1].edText.m_hWnd, &rect);
						POINT pt = {rect.left, rect.top};
						ScreenToClient(hWnd, &pt);
						if (0 > pt.y || pThis->m_dPage < pt.y)
							pThis->ScrollTo(pt.y + pThis->m_dScrollPos);
						else
						{
							GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect);
							pt.x = rect.left; pt.y = rect.top;
							ScreenToClient(hWnd, &pt);
							if (pt.y < 0)
								nScrollNotify = SB_LINEUP;
						}
					}
					
				}
				break;
			case VK_DOWN:
				{	
					if (I->nIndex != pThis->m_Lines.back().nIndex)
					{
						if (bFoundT)
							SetFocus(pThis->m_Lines.at(I->nIndex + 1).edText.m_hWnd);
						if (bFoundS)
							SetFocus(pThis->m_Lines.at(I->nIndex + 1).edSecond.m_hWnd);

				
						RECT rect;
						GetWindowRect(pThis->m_Lines[I->nIndex + 1].edText.m_hWnd, &rect);
						POINT pt = {rect.right, rect.bottom};
						ScreenToClient(hWnd, &pt);

						if (pThis->m_dScrollPos > pt.y || pThis->m_dScrollPos + pThis->m_dPage - 1 < pt.y)
							pThis->ScrollTo(pt.y + pThis->m_dScrollPos - pThis->m_dPage);
						else
						{
							GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect);
							pt.x = rect.left; pt.y = rect.bottom;
							ScreenToClient(hWnd, &pt);
							if (pt.y  >= pThis->m_dPage)
								nScrollNotify = SB_LINEDOWN;
						}
						
					} 
				}
				break;

			default:
				{	
					if (!bFoundT && !bFoundS) break;
					RECT rect;
					GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect);
					POINT pt = {rect.left, rect.top};
					ScreenToClient(hWnd, &pt);
					if (0 > pt.y || pThis->m_dPage < pt.y)
						pThis->ScrollTo(pt.y + pThis->m_dScrollPos);
					else
					{
						GetWindowRect(pThis->m_Lines[I->nIndex].edText.m_hWnd, &rect);
						pt.x = rect.left; pt.y = rect.top;
						ScreenToClient(hWnd, &pt);
						if (pt.y < 0)
							nScrollNotify = SB_LINEUP;
					}
				}
				break;
			}

			if (nScrollNotify!=-1)
			{
				SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(nScrollNotify,0), 0);
			}
		}
		break;//WM_KEYDOWN

	case WM_MOUSEWHEEL:
		{
			INT16 delta = (int)HIWORD(wParam);
			if (delta < 0)
				SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEDOWN,0), 0);
			else
				SendMessage(hWnd, WM_VSCROLL, MAKEWPARAM(SB_LINEUP,0), 0);
		}
		break;

//	case WM_PAINT: break;
	case WM_VSCROLL: OnVScroll(hWnd, wParam, lParam); break;
	case WM_ADDLINEAT:
		{
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			int nLine = LOWORD(wParam);
			int nSelEnd = HIWORD(wParam);
			HWND hEdit = (HWND)lParam;

			pThis->AddLineAt(nLine+1);
			int end = GetWindowTextLengthW(hEdit);
			SendMessage(hEdit, EM_SETSEL, (WPARAM)nSelEnd, (LPARAM)end);
			
			if (nSelEnd < end)
			{
				SendMessage(hEdit, WM_CUT, 0, 0);
				hEdit = pThis->m_Lines.at(nLine + 1).edText.m_hWnd;
				SendMessage(hEdit, WM_PASTE, 0, 0);
			}
			else
				hEdit = pThis->m_Lines.at(nLine + 1).edText.m_hWnd;

			SetFocus(hEdit);
			SendMessage(hEdit, EM_SETSEL, 0, 0);
		}
		break;

	case WM_DELLINEAT:
		{
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			int nLine = (int)wParam;
			HWND hEdit= (HWND)lParam;

			//1. copy the content from this line:
			int len = GetWindowTextLengthA(hEdit);
			len++;
			char* str = new char[len];
			int len2;
			if (0 < len)
			{
				GetWindowTextA(hEdit, str, len);
				hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd;
				len2 = GetWindowTextLengthA(hEdit);
				len2++;
				char* str2 = new char[len2];
				GetWindowTextA(hEdit, str2, len2);
				string sir = str2;
				sir += ' ';
				sir += str;
				SetWindowTextA(hEdit, sir.data());
				delete[] str2;
			}
			else
				hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd;

			//2. move cursor to the editbox above
			pThis->RemoveLineAt(nLine+1);
			SetFocus(hEdit);
			SendMessage(hEdit, EM_SETSEL, len2, len2);
			delete[] str;
		}
		break;

	case WM_DELLINEDELAT:
		{
			//using DEL
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			int nLine = (int)wParam;
			HWND hEdit= (HWND)lParam;

			//1. copy the content from this line:
			int len = GetWindowTextLengthA(hEdit);
			len++;
			char* str = new char[len];
			int len2;
			string sir;
			if (0 < len)
			{
				GetWindowTextA(hEdit, str, len);
				hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd;
				len2 = GetWindowTextLengthA(hEdit);
				len2++;
				char* str2 = new char[len2];
				GetWindowTextA(hEdit, str2, len2);
				sir = str2;
				sir += ' ';
				sir += str;
				delete[] str2;
			}
			else
				hEdit = pThis->m_Lines.at(nLine - 1).edText.m_hWnd;

			//2. move cursor to the editbox above
			pThis->RemoveLineAt(nLine);
			SetWindowTextA(hEdit, sir.data());
			SetFocus(hEdit);
			SendMessage(hEdit, EM_SETSEL, len2, len2);
			delete[] str;
		}
		break;
		
	case WM_SELECTLINE:
		{
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			if (pThis->m_bEnableLineSel == false)
				break;

			int nLine = (int)wParam;
			if (pThis->m_nSelLine > -1)
			{
				pThis->m_Lines.at(pThis->m_nSelLine).bSelected = false;
				RedrawWindow(pThis->m_Lines.at(pThis->m_nSelLine).edText.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
				RedrawWindow(pThis->m_Lines.at(pThis->m_nSelLine).edSecond.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
			}
			if (pThis->m_nSelLine != nLine)
			{
				pThis->m_nSelLine = nLine;
				pThis->m_Lines.at(nLine).bSelected = true;
				RedrawWindow(pThis->m_Lines.at(nLine).edText.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);
				RedrawWindow(pThis->m_Lines.at(nLine).edSecond.m_hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW);

				RECT rect;
				GetWindowRect(pThis->m_Lines[nLine].edText.m_hWnd, &rect);
				POINT pt = {rect.right, rect.bottom};
				ScreenToClient(hWnd, &pt);

				if (pThis->m_dScrollPos > pt.y || pThis->m_dScrollPos + pThis->m_dPage - 1 < pt.y || pt.y  >= pThis->m_dPage)
					pThis->ScrollTo(pt.y + pThis->m_dScrollPos - pThis->m_dPage);
			}
			else pThis->m_nSelLine = -1;
		}
		break;//WM_SELECTLINE

	case WM_CTLCOLOREDIT:
		{
			HDC hDC = (HDC)wParam;
			HWND hEdit = (HWND)lParam;
			HBRUSH hBrush = 0;
			
			CListSide* pThis = (CListSide*)GetWindowLongPtrW(hWnd, GWL_USERDATA);
			bool bFound = false;
			deque<CListSide::LINE>::iterator I;
			for (I = pThis->m_Lines.begin(); I != pThis->m_Lines.end(); I++)
			{
				if (hEdit == I->edSecond.m_hWnd || hEdit == I->edText.m_hWnd)
				{
					//we found the edit in the list
					if (I->bSelected)
					{
						//the edit is selected
						hBrush = CreateSolidBrush(RGB(0, 0, 255));
						SetBkColor(hDC, RGB(0, 0, 255));
						SetTextColor(hDC, RGB(255, 255, 255));
						break;
					}
					else
					{
						//the edit is not selected
						hBrush = CreateSolidBrush(RGB(255, 255, 255));
						SetBkColor(hDC, RGB(255, 255, 255));
						SetTextColor(hDC, RGB(0, 0, 0));
					}
				}
				//if we did not find the edit in the list, we keep searching, to know whether it is selected or not
			}
			return (LRESULT)hBrush;
		}
		break;//WM_CTLCOLOREDIT
	}

	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
Exemplo n.º 17
0
/* ----------------------------------------------------------------
    Win\Gui\Window C API
------------------------------------------------------------------*/
int wingui_control_static_autosize(HWND handle, int style, int extrastyle, int x, int y TSRMLS_DC)
{
	HDC dc;
	RECT rect;
	BOOL worked;
	UINT flags = DT_CALCRECT;

	dc = GetDC(handle);
	if (dc == 0) {
		goto error;
	}

	worked = GetClientRect(handle, &rect);

	if (worked == 0) {
		goto error;
	}

	/* get our flags right for drawtext */
	if ((SS_CENTER & style) == SS_CENTER) {
		flags |= DT_CENTER;
	} else if ((SS_RIGHT & style) == SS_RIGHT) {
		flags |= DT_RIGHT;
	} else if ((SS_LEFT & style) == SS_LEFT) {
		flags |= DT_LEFT;
	}
	
	if ( ((WS_EX_RTLREADING & extrastyle) == WS_EX_RTLREADING)
		|| ((WS_EX_LAYOUTRTL & extrastyle) == WS_EX_LAYOUTRTL) ) {
			flags |= DT_RTLREADING;
	}

	if ((SS_WORDELLIPSIS & style) == SS_WORDELLIPSIS) {
		flags |= DT_WORD_ELLIPSIS | DT_SINGLELINE;
	} else if ((SS_PATHELLIPSIS & style) == SS_PATHELLIPSIS) {
		flags |= DT_PATH_ELLIPSIS | DT_SINGLELINE;
	} else if ((SS_ENDELLIPSIS & style) == SS_ENDELLIPSIS) {
		flags |= DT_END_ELLIPSIS | DT_SINGLELINE;
	} 

	if ((SS_NOPREFIX & style) == SS_NOPREFIX) {
		flags |= DT_NOPREFIX;
	} 

	if ((SS_LEFTNOWORDWRAP & style) == SS_LEFTNOWORDWRAP) {
		flags |= DT_SINGLELINE;
	} else if ((SS_SIMPLE & style) == SS_SIMPLE) {
		flags |= DT_SINGLELINE;
	} else {
		flags |= DT_WORDBREAK;
	}

	if ((SS_EDITCONTROL & style) == SS_EDITCONTROL) {
		flags |= DT_EDITCONTROL;
	}

	if (IsWindowUnicode(handle)) {
		int length, worked_len;
		wchar_t * text;

		length = GetWindowTextLengthW(handle);
		text = safe_emalloc(length, sizeof(wchar_t), 1);

		worked_len = GetWindowTextW(handle, text, length + 1);
		if (worked_len == 0) {
			goto error;
		}

		worked = DrawTextW(dc, text, -1, &rect, flags); 

		if (worked == 0) {
			goto error;
		}
	} else {
		int length, worked_len;
		char * text;

		length = GetWindowTextLengthA(handle);
		text = safe_emalloc(length, sizeof(char), 1);

		worked_len = GetWindowTextA(handle, text, length + 1);
		if (worked_len == 0) {
			goto error;
		}

		worked = DrawTextA(dc, text, -1, &rect, flags); 

		if (worked == 0) {
			goto error;
		}
	}

    MoveWindow(handle, x, y, (rect.right - rect.left), (rect.bottom - rect.top), FALSE);
	ReleaseDC(handle, dc);
	return SUCCESS;

error:
	ReleaseDC(handle, dc);
	winsystem_create_error(GetLastError(), ce_winsystem_runtimeexception TSRMLS_CC);
	return FAILURE;
}
Exemplo n.º 18
0
void CLyricsDlg::UpdateByTagIDV1(HWND hDlg)
{
	if (m_bIsSet)
	{
		if (GetWindowTextLengthA(GetDlgItem(hDlg, IDC_ARTISTNAME)) != 0 ||
			GetWindowTextLengthA(GetDlgItem(hDlg, IDC_ALBUMNAME)) != 0 ||
			GetWindowTextLengthA(GetDlgItem(hDlg, IDC_SONGNAME)) != 0)
		{
			return;
		}
	}

	genDll.m_sSavingSong = genDll.m_sCurrentSong;

	static WCHAR wstrlast[MAX_PATH] = L"";
	//now we load the tagInfo and display what we have
	
	if (wcslen(genDll.m_sCurrentSong) > 0 && 0 != wcscmp(wstrlast, genDll.m_sCurrentSong))
	{
		SetDlgItemTextA(hDlg, IDC_ARTISTNAME, "");
		SetDlgItemTextA(hDlg, IDC_ALBUMNAME, "");
		SetDlgItemTextA(hDlg, IDC_SONGNAME, "");

		bool bArtist = false;
		bool bAlbum = false;
		bool bSong = false;

		wcscpy_s(wstrlast, MAX_PATH, genDll.m_sCurrentSong);
		//load open the file for reading:
		HANDLE hFile = CreateFile(wstrlast, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED
, 0);
		if (hFile == INVALID_HANDLE_VALUE)
		{
			char errs[20];
			DWORD dwError = GetLastError();
			sprintf_s(errs, 20, "Error 0x%x", dwError);
			MessageBoxA(hDlg, errs, "Error!", MB_ICONERROR);
#ifdef _DEBUG
			DebugBreak();
#endif
			return;
		}

		//so now, we have the file opened... we must load the last part of it:
		LARGE_INTEGER liSize;
		GetFileSizeEx(hFile, &liSize);
		DWORD dwRead;
		OVERLAPPED overl;
		memset(&overl, 0, sizeof(overl));
		overl.Offset = (DWORD)liSize.LowPart - 128;
		overl.hEvent = 0;
		ReadFile(hFile, &m_tagInfo, 128, &dwRead, &overl);
		GetOverlappedResult(hFile, &overl, &dwRead, true);

		if (m_tagInfo.cT == 'T' && m_tagInfo.cA == 'A' && m_tagInfo.cG == 'G')
		{
			if (dwRead != 128)
			{
				DWORD dwError = GetLastError();
				wsprintf(wstrlast, L"Error 0x%x", dwError);
				MessageBox(hDlg, wstrlast, L"Error!", MB_ICONERROR);
#ifdef _DEBUG
				DebugBreak();
#endif
				EndDialog(hDlg, IDCANCEL);
				return;
			}
			m_tagInfo.sAlbumName[29] = m_tagInfo.sArtistName[29] = m_tagInfo.sSongName[29] = 0;
			TrimString(m_tagInfo.sAlbumName);
			TrimString(m_tagInfo.sArtistName);
			TrimString(m_tagInfo.sSongName);

			SetDlgItemTextA(hDlg, IDC_ARTISTNAME, m_tagInfo.sArtistName);
			SetDlgItemTextA(hDlg, IDC_ALBUMNAME, m_tagInfo.sAlbumName);
			SetDlgItemTextA(hDlg, IDC_SONGNAME, m_tagInfo.sSongName);

			if (strlen(m_tagInfo.sArtistName) > 0) bArtist = true;
			if (strlen(m_tagInfo.sAlbumName) > 0) bAlbum = true;
			if (strlen(m_tagInfo.sSongName) > 0) bSong = true;
		}

		
		if (!bArtist || !bAlbum || !bSong)
			UpdateByTagIDV2(hDlg, hFile, bArtist, bAlbum, bSong);

		CloseHandle(hFile);
	}
}
Exemplo n.º 19
0
void CLyricsDlg::UpdateByFileName(HWND hDlg, bool bArtist, bool bAlbum, bool bSong)
{
	//we take the info from winamp
	//i.e.
	//736. Kataklysm - Taking the World By Storm - Winamp
	//until first dot and a ' ' is irrelevant
	//the last ' - Winamp' is irrelevant
	//then it follows: Artist - Song / Artist - Album - Song. we count how many '-' there are.
	string sText;
	int len = GetWindowTextLengthA(genDll.m_hWinamp);
	char* text = new char[len+1];
	GetWindowTextA(genDll.m_hWinamp, text, len+1);
	sText = text;
	delete[] text;
	
	//removing irrelevant text
	int x = sText.find('.', 0);
	sText.erase(0, x + 2);
	x = sText.rfind('-');
	sText.erase(x-1, sText.length()-1);

	//now result is in the format "xxxx - xxxx - xxx" or in the format "xxxx - xxxx"
	//we count the '-'s:
	
	int nCount = 0;
	int xs[3]; int i = 0;
	for (int i = 0; i < sText.length(); i++)
	{
		if (sText[i] == '-')
		{
			if (nCount > 2) break;
			xs[nCount] = i;
			nCount++;
		}
	}
	xs[nCount] = sText.length();
	//we have i '-'s. now we get each string and tream them.

	string strs[3];int j = 0;
	for (int i = 0; i <= nCount; i++)
	{
		if (nCount == 0) break;
		strs[i] = sText.substr(j, xs[i] - j);
		j = xs[i]+1;
	}
	
	for (j = 0; j <= nCount; j++)
	{
		//ltrim string i
		for (i = 0; i < strs[j].length(); i++)
		{
			if (strs[j][i] ==' ') strs[j].erase(i, 1);
			else break;
		}

		//rtrim
		for (i = strs[j].length() - 1; i >=0; i--)
		{
			if (strs[j][i] ==' ') strs[j].erase(i, 1);
			else break;
		}
	}

	switch (nCount)
	{
	case 0:
		//no '-' found => all sText is SongName
		SetDlgItemTextA(hDlg, IDC_SONGNAME, sText.data());
		break;
	case 1:
		//one '-' found => two substrings, 1 and 2, Artist and Song
		SetDlgItemTextA(hDlg, IDC_ARTISTNAME, strs[0].data());
		SetDlgItemTextA(hDlg, IDC_SONGNAME, strs[1].data());
		break;
	case 2:
		//three '-' found => three substrings, 1 and 2 and 3, artist and album and song
		SetDlgItemTextA(hDlg, IDC_ARTISTNAME, strs[0].data());
		SetDlgItemTextA(hDlg, IDC_ALBUMNAME, strs[1].data());
		SetDlgItemTextA(hDlg, IDC_SONGNAME, strs[2].data());
		break;
	}
}
Exemplo n.º 20
0
void CLyricsDlg::OnOk(HWND hDlg)
{
	CLyricsDlg* pThis = (CLyricsDlg*)GetWindowLongPtrA(hDlg, GWL_USERDATA);

	//we must check that all seconds were written correctly
	deque<CListSide::LINE>::iterator I, J;
	bool bWrong = false;
	for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++)
	{
		//must not be the last
		if (I->nIndex != pThis->m_List.m_Table.m_Lines.back().nIndex)
		{
			J = I + 1;
			char str[7];
			GetWindowTextA(I->edSecond.m_hWnd, str, 7);
			string sec = str;
			int nrSec = atoi(sec.substr(0, 1).c_str());
			nrSec *= 60;
			int valI = nrSec;
			nrSec = atoi(sec.substr(2, 2).c_str());
			valI += nrSec;

			GetWindowTextA(J->edSecond.m_hWnd, str, 7);
			sec = str;
			nrSec = atoi(sec.substr(0, 1).c_str());
			nrSec *= 60;
			int valJ = nrSec;
			nrSec = atoi(sec.substr(2, 2).c_str());
			valJ += nrSec;
			if (valI >= valJ)
			{
				bWrong = true;
				break;
			}
		}
	}

	bool bWrong2 = true;

	for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++)
	{
		//must not be the last
		int len = GetWindowTextLength(I->edText.m_hWnd);
		if (len)
		{
			bWrong2 = false;
			break;
		}
	}

	if (bWrong2) bWrong = true;

	if (bWrong)
	{
		MessageBoxW(hDlg, L"Toate secundele trebuiesc setate în ordine crescătoare, te rog setează o valoare corectă", L"Repetiție", MB_ICONEXCLAMATION);
		//focus & selection
		SetFocus(J->edSecond.m_hWnd);
		SendMessage(J->edSecond.m_hWnd, EM_SETSEL, 0, 5);
		//scroll
		RECT rect;
		GetWindowRect(J->edSecond.m_hWnd, &rect);
		POINT pt = {rect.left, rect.top};
		ScreenToClient(GetParent(J->edSecond.m_hWnd), &pt);
		pThis->m_List.m_Table.ScrollTo(pt.y);
		return;
	}

	HANDLE hFile = OpenLyricsFile(hDlg);
	if (hFile == INVALID_HANDLE_VALUE) return;
	DWORD dwWritten;

	for (I = pThis->m_List.m_Table.m_Lines.begin(); I != pThis->m_List.m_Table.m_Lines.end(); I++)
	{
		GenListCtrl::VERSE verse;
		char* str = new char[7];
		GetWindowTextA(I->edSecond.m_hWnd, str, 7);

		//str e de forma mm:ss
		string sec = str;
		int nrSec = atoi(sec.substr(0, 1).c_str());
		nrSec *= 60;
		verse.nrSec = nrSec;
		nrSec = atoi(sec.substr(2, 2).c_str());
		verse.nrSec += nrSec;
		WriteFile(hFile, &verse.nrSec, sizeof(WORD), &dwWritten, 0);
		delete[] str;

		byte len = (byte)GetWindowTextLengthA(I->edText.m_hWnd);
		len++;
		str = new char[len];
		GetWindowTextA(I->edText.m_hWnd, str, len);
		WriteFile(hFile, &len, 1, &dwWritten, 0);
		WriteFile(hFile, str, len, &dwWritten, 0);
		delete[] str;
	}

	CloseHandle(hFile);

	if (genDll.m_sSavingSong == genDll.m_sCurrentSong)
		SendMessage(genDll.m_hWinamp, WM_COMMAND, IDC_WINAMP_STOP, 0);

	//we now rewrite the specified .mp3 file
	hFile = CreateFile(genDll.m_sSavingSong.c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		DWORD dwError = GetLastError();
		char str[30];
		sprintf_s(str, 30, "Error 0x%x", dwError);
		MessageBoxA(genDll.m_hWinamp, str, "Error!", MB_ICONERROR);
#ifdef _DEBUG
		DebugBreak();
#endif
		EndDialog(hDlg, IDCANCEL);
		return;
	}

	//now, we search for ID3v1
	SetFilePointer(hFile, -128, 0, FILE_END);

	DWORD dwRead;
	ReadFile(hFile, &m_tagInfo, 128, &dwRead, 0);
	if (m_tagInfo.cT == 'T' && m_tagInfo.cA == 'A' && m_tagInfo.cG == 'G')
	{
		//it means the file already has an ID3v1. ensure that we read all (should always happen)
		if (dwRead != 128)
		{
			DWORD dwError = GetLastError();
			char str[30];
			sprintf_s(str, 30, "Error 0x%x", dwError);
			MessageBoxA(hDlg, str, "Error!", MB_ICONERROR);
#ifdef _DEBUG
			DebugBreak();
#endif
			CloseHandle(hFile);
			EndDialog(hDlg, IDCANCEL);
			return;
		}

		//reposition again and write the new structure:
		SetFilePointer(hFile, -128, 0, FILE_END);
	}
	//else reposition to the end of file:
	else
	{
		memset(&m_tagInfo, 0, sizeof(m_tagInfo));
		m_tagInfo.cT = 'T'; m_tagInfo.cA = 'A'; m_tagInfo.cG = 'G';
		m_tagInfo.dGenre = 255;

		LARGE_INTEGER liSize;
		GetFileSizeEx(hFile, &liSize);

		SetFilePointer(hFile, 128, 0, FILE_END);
		if (false == SetEndOfFile(hFile))
		{
			DWORD dwError = GetLastError();
			int x = 0;
			x++;
		}

		GetFileSizeEx(hFile, &liSize);


		SetFilePointer(hFile, -128, 0, FILE_END);
	}

	GetDlgItemTextA(hDlg, IDC_ARTISTNAME, m_tagInfo.sArtistName, 30);
	GetDlgItemTextA(hDlg, IDC_ALBUMNAME, m_tagInfo.sAlbumName, 30);
	GetDlgItemTextA(hDlg, IDC_SONGNAME, m_tagInfo.sSongName, 30);

	if (false == WriteFile(hFile, &m_tagInfo, 128, &dwRead, 0))
	{
		DWORD dwError = GetLastError();
		char str[30];
		sprintf_s(str, "Error 0x%x", dwError);
		MessageBoxA(hDlg, str, "Error!", MB_ICONERROR);
#ifdef _DEBUG
		DebugBreak();
#endif
		CloseHandle(hFile);
		EndDialog(hDlg, IDCANCEL);
		return;
	}
	CloseHandle(hFile);

	//and finally, we add this lyrics info in the list.
	LYRICSINFO lyrinfo;
	lyrinfo.sAlbum = m_tagInfo.sAlbumName;
	lyrinfo.sArtist = m_tagInfo.sArtistName;
	lyrinfo.sSong = m_tagInfo.sSongName;
	lyrinfo.wsFileName = genDll.m_sSavingSong;
	genDll.m_LyricsFiles.push_back(lyrinfo);

	EndDialog(hDlg, IDOK);
}
Exemplo n.º 21
0
INT_PTR CALLBACK DlgProcContainerOptions(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
    TContainerData *pContainer = 0;
    HWND   hwndTree = GetDlgItem(hwndDlg, IDC_SECTIONTREE);
    pContainer = (TContainerData *) GetWindowLongPtr(hwndDlg, GWLP_USERDATA);

    switch (msg) {
    case WM_INITDIALOG: {
        wchar_t			szNewTitle[128];
        TContainerData *pContainer = 0;
        int   			i, j;
        TVINSERTSTRUCT 	tvis = {0};
        HTREEITEM 		hItem;
        int				nr_layouts = 0;
        const 			TSideBarLayout* sblayouts = CSideBar::getLayouts(nr_layouts);

        SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LONG_PTR) lParam);
        pContainer = (TContainerData *) lParam;
        pContainer->hWndOptions = hwndDlg;
        TranslateDialogDefault(hwndDlg);
        SetWindowText(hwndDlg, TranslateT("Container options"));
        mir_sntprintf(szNewTitle, SIZEOF(szNewTitle), TranslateT("Configure container options for\n%s"), !_tcscmp(pContainer->szName, _T("default")) ?
                      TranslateT("Default container") : pContainer->szName);
        SetDlgItemText(hwndDlg, IDC_HEADERBAR, szNewTitle);
        Utils::enableDlgControl(hwndDlg, IDC_O_HIDETITLE, CSkin::m_frameSkins ? FALSE : TRUE);
        CheckDlgButton(hwndDlg, IDC_CNTPRIVATE, pContainer->settings->fPrivate ? BST_CHECKED : BST_UNCHECKED);

        SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the top"));
        SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Tabs at the bottom"));
        SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the left side"));
        SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_INSERTSTRING, -1, (LPARAM)TranslateT("Switch bar on the right side"));

        SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("Globally on"));
        SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("On, if present"));
        SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("Globally OFF"));
        SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("On, if present, always in bottom display"));

        SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("On, if present"));
        SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_INSERTSTRING, -1,
                           (LPARAM)TranslateT("Don't show them"));

        for (i=0; i < nr_layouts; i++)
            SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_INSERTSTRING, -1, (LPARAM)TranslateTS(sblayouts[i].szName));

        /* bits 24 - 31 of dwFlagsEx hold the side bar layout id */
        SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_SETCURSEL, (WPARAM)((pContainer->settings->dwFlagsEx & 0xff000000) >> 24), 0);


        SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings);
        SendDlgItemMessage(hwndDlg, IDC_TITLEFORMAT, EM_LIMITTEXT, TITLE_FORMATLEN - 1, 0);
        SetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat);
        SetDlgItemText(hwndDlg, IDC_THEME, pContainer->szRelThemeFile);
        for (i=0; i < NR_O_PAGES; i++) {
            tvis.hParent = NULL;
            tvis.hInsertAfter = TVI_LAST;
            tvis.item.mask = TVIF_TEXT | TVIF_PARAM;
            tvis.item.pszText = TranslateTS(o_pages[i].szTitle);
            tvis.item.lParam = i;
            hItem = TreeView_InsertItem(hwndTree, &tvis);
            if (i == 0)
                SendMessage(hwndTree, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem);
            for (j = 0; j < NR_O_OPTIONSPERPAGE && o_pages[i].uIds[j] != 0; j++)
                Utils::showDlgControl(hwndDlg, o_pages[i].uIds[j], SW_HIDE);
            ShowPage(hwndDlg, i, FALSE);
        }
        SendMessage(hwndDlg, WM_SETICON, ICON_SMALL, (LPARAM)LoadSkinnedIcon(SKINICON_EVENT_MESSAGE));
        SendMessage(hwndDlg, WM_SETICON, ICON_BIG, (LPARAM)LoadSkinnedIconBig(SKINICON_EVENT_MESSAGE));
        ShowPage(hwndDlg, 0, TRUE);
        SetFocus(hwndTree);
        Utils::enableDlgControl(hwndDlg, IDC_APPLY, FALSE);

        HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_DESC, WM_GETFONT, 0, 0);
        LOGFONT lf = {0};

        GetObject(hFont, sizeof(lf), &lf);
        lf.lfHeight = (int)(lf.lfHeight * 1.2);
        hFont = CreateFontIndirect(&lf);

        SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_SETFONT, (WPARAM)hFont, TRUE);

        if (pContainer->isCloned && pContainer->hContactFrom != 0) {
            Utils::showDlgControl(hwndDlg, IDC_CNTPRIVATE, SW_HIDE);
            Utils::showDlgControl(hwndDlg, IDC_O_CNTPRIVATE, SW_HIDE);
        }
        return FALSE;
    }

    case WM_CTLCOLOREDIT:
    case WM_CTLCOLORSTATIC:
    {
        HWND hwndChild = (HWND)lParam;
        UINT id = GetDlgCtrlID(hwndChild);

        if (hwndChild == GetDlgItem(hwndDlg, IDC_TITLEBOX)) {
            ::SetTextColor((HDC)wParam, RGB(60, 60, 150));
        } else if (hwndChild == GetDlgItem(hwndDlg, IDC_DESC))
            ::SetTextColor((HDC)wParam, RGB(160, 50, 50));
        if (id == IDC_TSLABEL_REOPENWARN)
            break;
        SetBkColor((HDC)wParam, GetSysColor(COLOR_WINDOW));
        return (INT_PTR)GetSysColorBrush(COLOR_WINDOW);
    }

    case WM_NOTIFY:
        if (wParam == IDC_SECTIONTREE && ((LPNMHDR)lParam)->code == TVN_SELCHANGED) {
            NMTREEVIEW *pmtv = (NMTREEVIEW *)lParam;

            ShowPage(hwndDlg, pmtv->itemOld.lParam, 0);
            ShowPage(hwndDlg, pmtv->itemNew.lParam, 1);
        }
        break;

    case WM_HSCROLL:
        if ((HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_ACTIVE) || (HWND)lParam == GetDlgItem(hwndDlg, IDC_TRANSPARENCY_INACTIVE))
            Utils::enableDlgControl(hwndDlg, IDC_APPLY, TRUE);
        break;

    case WM_COMMAND:
        switch (LOWORD(wParam)) {
        case IDC_CNTPRIVATE: {

            if (IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) {
                Utils::ReadPrivateContainerSettings(pContainer, true);
                pContainer->settings->fPrivate = true;
            }
            else {
                if (pContainer->settings != &PluginConfig.globalContainerSettings) {
                    char szCname[40];
                    mir_snprintf(szCname, 40, "%s%d_Blob", CNT_BASEKEYNAME, pContainer->iContainerIndex);
                    pContainer->settings->fPrivate = false;
                    db_set_blob(0, SRMSGMOD_T, szCname, pContainer->settings, sizeof(TContainerSettings));
                    mir_free(pContainer->settings);
                }
                pContainer->settings = &PluginConfig.globalContainerSettings;
                pContainer->settings->fPrivate = false;
            }
            SendMessage(hwndDlg, DM_SC_INITDIALOG, 0, (LPARAM)pContainer->settings);
            goto do_apply;
        }
        case IDC_TRANSPARENCY: {
            int isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY);

            Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans ? TRUE : FALSE);
            Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans ? TRUE : FALSE);
            goto do_apply;
        }
        case IDC_SECTIONTREE:
        case IDC_DESC:
            return 0;
        case IDC_SAVESIZEASGLOBAL: {
            WINDOWPLACEMENT wp = {0};

            wp.length = sizeof(wp);
            if (GetWindowPlacement(pContainer->hwnd, &wp)) {
                db_set_dw(0, SRMSGMOD_T, "splitx", wp.rcNormalPosition.left);
                db_set_dw(0, SRMSGMOD_T, "splity", wp.rcNormalPosition.top);
                db_set_dw(0, SRMSGMOD_T, "splitwidth", wp.rcNormalPosition.right - wp.rcNormalPosition.left);
                db_set_dw(0, SRMSGMOD_T, "splitheight", wp.rcNormalPosition.bottom - wp.rcNormalPosition.top);
            }
            break;
        }
        case IDC_O_ENABLESOUNDS:
            SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0);
            break;
        case IDC_TITLEFORMAT:
            if (HIWORD(wParam) != EN_CHANGE || (HWND) lParam != GetFocus())
                return TRUE;
            goto do_apply;
        case IDC_SELECTTHEME: {
            const wchar_t *szFileName = GetThemeFileName(0);

            if (PathFileExists(szFileName)) {
                SetDlgItemText(hwndDlg, IDC_THEME, szFileName);
                goto do_apply;
            }
            break;
        }

        case IDC_O_HELP_TITLEFORMAT:
            CallService(MS_UTILS_OPENURL, OUF_NEWWINDOW|OUF_TCHAR, (LPARAM)_T("http://miranda.or.at/TabSRMM/TitleBarFormatting"));
            break;

        case IDOK:
        case IDC_APPLY: {

            SendMessage(hwndDlg, DM_SC_BUILDLIST, 0, (LPARAM)pContainer->settings);

            pContainer->settings->dwTransparency = MAKELONG((WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_GETPOS, 0, 0),
                                                   (WORD)SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_GETPOS, 0, 0));

            pContainer->settings->avatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_GETCURSEL, 0, 0);
            pContainer->settings->ownAvatarMode = (WORD)SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_GETCURSEL, 0, 0);

            GetDlgItemText(hwndDlg, IDC_TITLEFORMAT, pContainer->settings->szTitleFormat, TITLE_FORMATLEN);
            pContainer->settings->szTitleFormat[TITLE_FORMATLEN - 1] = 0;

            pContainer->szRelThemeFile[0] = pContainer->szAbsThemeFile[0] = 0;

            if (GetWindowTextLengthA(GetDlgItem(hwndDlg, IDC_THEME)) > 0) {
                wchar_t	szFinalThemeFile[MAX_PATH], szFilename[MAX_PATH];

                GetDlgItemText(hwndDlg, IDC_THEME, szFilename, MAX_PATH);
                szFilename[MAX_PATH - 1] = 0;
                M.pathToAbsolute(szFilename, szFinalThemeFile);

                if (_tcscmp(szFilename, pContainer->szRelThemeFile))
                    pContainer->fPrivateThemeChanged = TRUE;

                if (PathFileExists(szFinalThemeFile))
                    mir_sntprintf(pContainer->szRelThemeFile, MAX_PATH, _T("%s"), szFilename);
                else
                    pContainer->szRelThemeFile[0] = 0;
            }
            else {
                pContainer->szRelThemeFile[0] = 0;
                pContainer->fPrivateThemeChanged = TRUE;
            }

            Utils::SettingsToContainer(pContainer);

            if (!IsDlgButtonChecked(hwndDlg, IDC_CNTPRIVATE)) {
                ReloadGlobalContainerSettings(true);
                ::db_set_blob(0, SRMSGMOD_T, CNT_KEYNAME, &PluginConfig.globalContainerSettings, sizeof(TContainerSettings));
            }
            else {
                char *szSetting = "CNTW_";
                Utils::SaveContainerSettings(pContainer, szSetting);
            }

            SendMessage(pContainer->hwnd, DM_CONFIGURECONTAINER, 0, 0);
            BroadCastContainer(pContainer, DM_SETINFOPANEL, 0, 0);

            ShowWindow(pContainer->hwnd, SW_HIDE);
            {
                RECT	rc;

                GetWindowRect(pContainer->hwnd, &rc);
                SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left) - 1, (rc.bottom - rc.top) - 1, SWP_NOZORDER | SWP_DRAWFRAME | SWP_FRAMECHANGED);
                SetWindowPos(pContainer->hwnd, 0, rc.left, rc.top, (rc.right - rc.left), (rc.bottom - rc.top), SWP_NOZORDER | SWP_DRAWFRAME | SWP_SHOWWINDOW);
            }

            if (LOWORD(wParam) == IDOK)
                DestroyWindow(hwndDlg);
            else
                Utils::enableDlgControl(hwndDlg, IDC_APPLY, FALSE);

            break;
        }
        case IDCANCEL:
            DestroyWindow(hwndDlg);
            return TRUE;
        default:
do_apply:
            Utils::enableDlgControl(hwndDlg, IDC_APPLY, TRUE);
            break;
        }
        break;
    case DM_SC_INITDIALOG: {
        TContainerSettings* cs = (TContainerSettings *)lParam;

        DWORD dwFlags = cs->dwFlags;
        DWORD dwTransparency = cs->dwTransparency;
        DWORD dwFlagsEx = cs->dwFlagsEx;
        int  isTrans;
        BOOL fAllowTrans = FALSE;

        if (PluginConfig.m_WinVerMajor >= 6)
            fAllowTrans = TRUE;
        else
            fAllowTrans = (!CSkin::m_skinEnabled);

        MY_CheckDlgButton(hwndDlg, IDC_O_HIDETITLE, dwFlags & CNT_NOTITLE);
        MY_CheckDlgButton(hwndDlg, IDC_O_DONTREPORT, dwFlags & CNT_DONTREPORT);
        MY_CheckDlgButton(hwndDlg, IDC_O_NOTABS, dwFlags & CNT_HIDETABS);
        MY_CheckDlgButton(hwndDlg, IDC_O_STICKY, dwFlags & CNT_STICKY);
        MY_CheckDlgButton(hwndDlg, IDC_O_FLASHNEVER, dwFlags & CNT_NOFLASH);
        MY_CheckDlgButton(hwndDlg, IDC_O_FLASHALWAYS, dwFlags & CNT_FLASHALWAYS);
        MY_CheckDlgButton(hwndDlg, IDC_O_FLASHDEFAULT, !((dwFlags & CNT_NOFLASH) || (dwFlags & CNT_FLASHALWAYS)));
        MY_CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY);
        MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTUNFOCUSED2, dwFlags & CNT_DONTREPORTUNFOCUSED);
        MY_CheckDlgButton(hwndDlg, IDC_DONTREPORTFOCUSED2, dwFlags & CNT_DONTREPORTFOCUSED);
        MY_CheckDlgButton(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, dwFlags & CNT_ALWAYSREPORTINACTIVE);
        MY_CheckDlgButton(hwndDlg, IDC_CNTNOSTATUSBAR, dwFlags & CNT_NOSTATUSBAR);
        MY_CheckDlgButton(hwndDlg, IDC_HIDEMENUBAR, dwFlags & CNT_NOMENUBAR);
        MY_CheckDlgButton(hwndDlg, IDC_HIDETOOLBAR, dwFlags & CNT_HIDETOOLBAR);
        MY_CheckDlgButton(hwndDlg, IDC_BOTTOMTOOLBAR, dwFlags & CNT_BOTTOMTOOLBAR);
        MY_CheckDlgButton(hwndDlg, IDC_UIDSTATUSBAR, dwFlags & CNT_UINSTATUSBAR);
        MY_CheckDlgButton(hwndDlg, IDC_VERTICALMAX, dwFlags & CNT_VERTICALMAX);
#if defined(__FEAT_EXP_AUTOSPLITTER)
        MY_CheckDlgButton(hwndDlg, IDC_AUTOSPLITTER, dwFlags & CNT_AUTOSPLITTER);
#endif
        MY_CheckDlgButton(hwndDlg, IDC_AVATARSONTASKBAR, dwFlags & CNT_AVATARSONTASKBAR);
        MY_CheckDlgButton(hwndDlg, IDC_INFOPANEL, dwFlags & CNT_INFOPANEL);
        MY_CheckDlgButton(hwndDlg, IDC_USEGLOBALSIZE, dwFlags & CNT_GLOBALSIZE);

        MY_CheckDlgButton(hwndDlg, IDC_FLASHICON, dwFlagsEx & TCF_FLASHICON);
        MY_CheckDlgButton(hwndDlg, IDC_FLASHLABEL, dwFlagsEx & TCF_FLASHLABEL);
        MY_CheckDlgButton(hwndDlg, IDC_CLOSEBUTTONONTABS, dwFlagsEx & TCF_CLOSEBUTTON);

        MY_CheckDlgButton(hwndDlg, IDC_SINGLEROWTAB, dwFlagsEx & TCF_SINGLEROWTABCONTROL);
        MY_CheckDlgButton(hwndDlg, IDC_BUTTONTABS, dwFlagsEx & TCF_FLAT);

        MY_CheckDlgButton(hwndDlg, IDC_O_ENABLESOUNDS, !(dwFlags & CNT_NOSOUND));
        MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSMINIMIZED, dwFlagsEx & CNT_EX_SOUNDS_MINIMIZED);
        MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSUNFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_UNFOCUSED);
        MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSINACTIVE, dwFlagsEx & CNT_EX_SOUNDS_INACTIVETABS);
        MY_CheckDlgButton(hwndDlg, IDC_O_SOUNDSFOCUSED, dwFlagsEx & CNT_EX_SOUNDS_FOCUSED);

        SendMessage(hwndDlg, DM_SC_CONFIG, 0, 0);

        if (!(dwFlagsEx & (TCF_SBARLEFT | TCF_SBARRIGHT)))
            SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlags & CNT_TABSBOTTOM ? 1 : 0, 0);
        else
            SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_SETCURSEL, dwFlagsEx & TCF_SBARLEFT ? 2 : 3, 0);

        if (LOBYTE(LOWORD(GetVersion())) >= 5 && fAllowTrans)
            CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, dwFlags & CNT_TRANSPARENCY);
        else
            CheckDlgButton(hwndDlg, IDC_TRANSPARENCY, FALSE);

        Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY, PluginConfig.m_WinVerMajor >= 5 && fAllowTrans ? TRUE : FALSE);

        isTrans = IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY);
        Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_ACTIVE, isTrans ? TRUE : FALSE);
        Utils::enableDlgControl(hwndDlg, IDC_TRANSPARENCY_INACTIVE, isTrans ? TRUE : FALSE);

        SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255));
        SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETRANGE, 0, (LPARAM)MAKELONG(50, 255));

        SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_ACTIVE, TBM_SETPOS, TRUE, (LPARAM)LOWORD(dwTransparency));
        SendDlgItemMessage(hwndDlg, IDC_TRANSPARENCY_INACTIVE, TBM_SETPOS, TRUE, (LPARAM)HIWORD(dwTransparency));

        Utils::enableDlgControl(hwndDlg, IDC_O_DONTREPORT, nen_options.bWindowCheck == 0);
        Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTUNFOCUSED2, nen_options.bWindowCheck == 0);
        Utils::enableDlgControl(hwndDlg, IDC_DONTREPORTFOCUSED2, nen_options.bWindowCheck == 0);
        Utils::enableDlgControl(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE, nen_options.bWindowCheck == 0);

        SendDlgItemMessage(hwndDlg, IDC_AVATARMODE, CB_SETCURSEL, (WPARAM)cs->avatarMode, 0);
        SendDlgItemMessage(hwndDlg, IDC_OWNAVATARMODE, CB_SETCURSEL, (WPARAM)cs->ownAvatarMode, 0);

        Utils::showDlgControl(hwndDlg, IDC_O_EXPLAINGLOBALNOTIFY, nen_options.bWindowCheck ? SW_SHOW : SW_HIDE);

        SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETRANGE, 0, MAKELONG(1000, 0));
        SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_SETPOS, 0, (LPARAM)cs->autoCloseSeconds);
        break;
    }

    case DM_SC_CONFIG: {
        LRESULT enable = (IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) ? BST_CHECKED : BST_UNCHECKED);
        Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSINACTIVE, enable);
        Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSUNFOCUSED, enable);
        Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSMINIMIZED, enable);
        Utils::enableDlgControl(hwndDlg, IDC_O_SOUNDSFOCUSED, enable);
        return 0;
    }

    case DM_SC_BUILDLIST: {
        DWORD dwNewFlags = 0, dwNewFlagsEx = 0;
        TContainerSettings* cs = (TContainerSettings *)lParam;

        dwNewFlags = (IsDlgButtonChecked(hwndDlg, IDC_O_HIDETITLE) ? CNT_NOTITLE : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_DONTREPORT) ? CNT_DONTREPORT : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_NOTABS) ? CNT_HIDETABS : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_STICKY) ? CNT_STICKY : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHALWAYS) ? CNT_FLASHALWAYS : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHNEVER) ? CNT_NOFLASH : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_TRANSPARENCY) ? CNT_TRANSPARENCY : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTUNFOCUSED2) ? CNT_DONTREPORTUNFOCUSED : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_DONTREPORTFOCUSED2) ? CNT_DONTREPORTFOCUSED : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_ALWAYSPOPUPSINACTIVE) ? CNT_ALWAYSREPORTINACTIVE : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_CNTNOSTATUSBAR) ? CNT_NOSTATUSBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_HIDEMENUBAR) ? CNT_NOMENUBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_HIDETOOLBAR) ? CNT_HIDETOOLBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_BOTTOMTOOLBAR) ? CNT_BOTTOMTOOLBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_UIDSTATUSBAR) ? CNT_UINSTATUSBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_USEGLOBALSIZE) ? CNT_GLOBALSIZE : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_INFOPANEL) ? CNT_INFOPANEL : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_O_ENABLESOUNDS) ? 0 : CNT_NOSOUND) |
                     (IsDlgButtonChecked(hwndDlg, IDC_AVATARSONTASKBAR) ? CNT_AVATARSONTASKBAR : 0) |
                     (IsDlgButtonChecked(hwndDlg, IDC_VERTICALMAX) ? CNT_VERTICALMAX : 0) |
#if defined(__FEAT_EXP_AUTOSPLITTER)
                     (IsDlgButtonChecked(hwndDlg, IDC_AUTOSPLITTER) ? CNT_AUTOSPLITTER : 0) |
#endif
                     (CNT_NEWCONTAINERFLAGS);

        LRESULT iTabMode = SendDlgItemMessage(hwndDlg, IDC_TABMODE, CB_GETCURSEL, 0, 0);
        LRESULT iTabLayout = SendDlgItemMessage(hwndDlg, IDC_SBARLAYOUT, CB_GETCURSEL, 0, 0);

        dwNewFlagsEx = 0;

        if (iTabMode < 2)
            dwNewFlags = ((iTabMode == 1) ? (dwNewFlags | CNT_TABSBOTTOM) : (dwNewFlags & ~CNT_TABSBOTTOM));
        else {
            dwNewFlags &= ~CNT_TABSBOTTOM;
            dwNewFlagsEx = iTabMode == 2 ? TCF_SBARLEFT : TCF_SBARRIGHT;
        }

        dwNewFlagsEx |= ((IsDlgButtonChecked(hwndDlg, IDC_FLASHICON) ? TCF_FLASHICON : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_FLASHLABEL) ? TCF_FLASHLABEL : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_BUTTONTABS) ? TCF_FLAT : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_CLOSEBUTTONONTABS) ? TCF_CLOSEBUTTON : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_SINGLEROWTAB) ? TCF_SINGLEROWTABCONTROL : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSMINIMIZED) ? CNT_EX_SOUNDS_MINIMIZED : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSUNFOCUSED) ? CNT_EX_SOUNDS_UNFOCUSED : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSFOCUSED) ? CNT_EX_SOUNDS_FOCUSED : 0) |
                         (IsDlgButtonChecked(hwndDlg, IDC_O_SOUNDSINACTIVE) ? CNT_EX_SOUNDS_INACTIVETABS : 0)
                        );

        /* bits 24 - 31 of dwFlagsEx hold the sidebar layout id */
        dwNewFlagsEx |= ((int)((iTabLayout << 24) & 0xff000000));

        if (IsDlgButtonChecked(hwndDlg, IDC_O_FLASHDEFAULT))
            dwNewFlags &= ~(CNT_FLASHALWAYS | CNT_NOFLASH);

        cs->dwFlags = dwNewFlags;
        cs->dwFlagsEx = dwNewFlagsEx;
        cs->autoCloseSeconds = (WORD)SendDlgItemMessage(hwndDlg, IDC_AUTOCLOSETABSPIN, UDM_GETPOS, 0, 0);
        break;
    }
    case WM_DESTROY: {
        pContainer->hWndOptions = 0;
        SetWindowLongPtr(hwndDlg, GWLP_USERDATA, 0);

        HFONT hFont = (HFONT)SendDlgItemMessage(hwndDlg, IDC_TITLEBOX, WM_GETFONT, 0, 0);
        DeleteObject(hFont);
        break;
    }
    }
    return FALSE;
}
Exemplo n.º 22
0
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
	static PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1,
		PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,
		32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 };
	static GLuint PixelFormat;
	static HWND hEdit;
	static HFONT hFont;
	static HINSTANCE hRtLib;
	static BOOL bEditVisible = TRUE;
	static HGLRC hRC;
	switch (msg)
	{
	case WM_CREATE:
		hRtLib = LoadLibrary(TEXT("RICHED32"));
		hFont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("Consolas"));
		hEdit = CreateWindowEx(WS_EX_LAYERED, RICHEDIT_CLASS, 0, WS_VISIBLE | WS_POPUP | WS_HSCROLL |
			WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_NOHIDESEL,
			0, 0, 0, 0, hWnd, 0, ((LPCREATESTRUCT)lParam)->hInstance, 0);
		SendMessage(hEdit, EM_SETTEXTMODE, TM_PLAINTEXT, 0);
		SendMessage(hEdit, EM_LIMITTEXT, -1, 0);
		EditWndProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)EditProc);
		SendMessage(hEdit, WM_SETFONT, (WPARAM)hFont, 0);
		if (!(hDC = GetDC(hWnd)) ||
			!(PixelFormat = ChoosePixelFormat(hDC, &pfd)) ||
			!SetPixelFormat(hDC, PixelFormat, &pfd) ||
			!(hRC = wglCreateContext(hDC)) ||
			!wglMakeCurrent(hDC, hRC) ||
			glewInit() != GLEW_OK ||
			!InitGL()) return -1;
		SetWindowText(hEdit, 
			TEXT("#define pi 3.14159265358979\r\n")
			TEXT("uniform float time;\r\n")
			TEXT("void main()\r\n")
			TEXT("{\r\n")
			TEXT("	vec2 p = gl_FragCoord;\r\n")
			TEXT("	float c = 0.0;\r\n")
			TEXT("	for (float i = 0.0; i < 5.0; i++)\r\n")
			TEXT("	{\r\n")
			TEXT("		vec2 b = vec2(\r\n")
			TEXT("		sin(time + i * pi / 7) * 256 + 512,\r\n")
			TEXT("		cos(time + i * pi / 2) * 256 + 384\r\n")
			TEXT("		);\r\n")
			TEXT("		c += 32 / distance(p, b);\r\n")
			TEXT("	}\r\n")
			TEXT("	gl_FragColor = vec4(c*c / sin(time), c*c / 2, c*c, 1.0);\r\n")
			TEXT("}\r\n")
			);
		PostMessage(hWnd, WM_CREATED, 0, 0);
		break;
	case WM_CREATED:
		SendMessage(hWnd, WM_COMMAND, MAKEWPARAM(0, EN_CHANGE), (long)hEdit);
		SendMessage(hEdit, EM_SETEVENTMASK, 0, (LPARAM)(SendMessage(hEdit, EM_GETEVENTMASK, 0, 0) | ENM_CHANGE));
		SetFocus(hEdit);
		PostMessage(hEdit, WM_SETALPHA, SHOWEDITALPHA, 0);
		break;
	case WM_MOVE:
		{
			RECT rect;
			GetClientRect(hWnd, &rect);
			ClientToScreen(hWnd, (LPPOINT)&rect.left);
			ClientToScreen(hWnd, (LPPOINT)&rect.right);
			MoveWindow(hEdit, rect.left + 16, rect.top + 16, rect.right - rect.left - 32, rect.bottom - rect.top - 32, 1);
		}
		break;
	case WM_COMMAND:
		switch (LOWORD(wParam))
		{
		case 0:
			if (HIWORD(wParam) == EN_CHANGE)
			{
				const DWORD dwSize = GetWindowTextLengthA(hEdit);
				if (!dwSize) return 0;
				LPSTR lpszText = (LPSTR)GlobalAlloc(0, (dwSize + 1)*sizeof(CHAR));
				if (!lpszText) return 0;
				GetWindowTextA(hEdit, lpszText, dwSize + 1);
				const GLuint newProgram = CreateProgram(vsrc, lpszText);
				if (newProgram)
				{
					if (program) glDeleteProgram(program);
					program = newProgram;
					SetWindowText(hWnd, TEXT("フラグメントシェーダ [コンパイル成功]"));
				}
				else
				{
					SetWindowText(hWnd, TEXT("フラグメントシェーダ [コンパイル失敗]"));
				}
				GlobalFree(lpszText);
			}
			break;
		case ID_EDITSHOW:
			ShowWindow(hEdit, IsWindowVisible(hEdit) ? SW_HIDE : SW_NORMAL);
			break;
		case ID_SELECTALL:
			if (IsWindowVisible(hEdit))
			{
				SendMessage(hEdit, EM_SETSEL, 0, -1);
				SetFocus(hEdit);
			}
			break;
		}
		break;
	case WM_RBUTTONDOWN:
	case WM_LBUTTONDOWN:
		SendMessage(hWnd, WM_COMMAND, ID_EDITSHOW, 0);
		break;
	case WM_ACTIVATE:
		active = !HIWORD(wParam);
		break;
	case WM_DESTROY:
		DeleteObject(hFont);
		if (program) glDeleteProgram(program);
		if (vbo) glDeleteBuffers(1, &vbo);
		if (vao) glDeleteVertexArrays(1, &vao);
		if (hRC)
		{
			wglMakeCurrent(0, 0);
			wglDeleteContext(hRC);
		}
		if (hDC) ReleaseDC(hWnd, hDC);
		DestroyWindow(hEdit);
		FreeLibrary(hRtLib);
		PostQuitMessage(0);
		break;
	case WM_SYSCOMMAND:
		switch (wParam)
		{
		case SC_SCREENSAVE:
		case SC_MONITORPOWER:
			return 0;
		}
	default:
		return DefWindowProc(hWnd, msg, wParam, lParam);
	}
	return 0;
}