summaryrefslogtreecommitdiff
path: root/plugins/SendScreenshotPlus/src
diff options
context:
space:
mode:
authorRené Schümann <white06tiger@gmail.com>2014-06-07 02:09:06 +0000
committerRené Schümann <white06tiger@gmail.com>2014-06-07 02:09:06 +0000
commite0c488c6dc749b80d29a0de678a40fea3510695b (patch)
tree342e49a7cb875590b59bec99b18b27140c579c76 /plugins/SendScreenshotPlus/src
parenta03937bb912c76af61f04da1c5d5a5e7d5e4d7aa (diff)
SendSS:
! fixed non-centered text in capture desktop size edit box (resource.rc) ! fixed x86_64 related type error (CSendImageShack) - removed duplicate code, and "removed" ability to use custom icons for capture tabs (we're using the same icon anyway, no need to load it thrice) + added local file feature to upload existing local files (resource, UMainForm, mir_string) reduced function DlgProc_CaptureWindow and DlgProc_CaptureDesktop to just DlgProc_CaptureTabPage as we use less code with only one function handling all 3 tab pages ("lot" of shared code) git-svn-id: http://svn.miranda-ng.org/main/trunk@9416 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/SendScreenshotPlus/src')
-rw-r--r--plugins/SendScreenshotPlus/src/CSendImageShack.cpp2
-rw-r--r--plugins/SendScreenshotPlus/src/UMainForm.cpp164
-rw-r--r--plugins/SendScreenshotPlus/src/UMainForm.h5
-rw-r--r--plugins/SendScreenshotPlus/src/mir_string.h99
-rw-r--r--plugins/SendScreenshotPlus/src/resource.h7
5 files changed, 150 insertions, 127 deletions
diff --git a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp
index 9d37604197..c12eed48fe 100644
--- a/plugins/SendScreenshotPlus/src/CSendImageShack.cpp
+++ b/plugins/SendScreenshotPlus/src/CSendImageShack.cpp
@@ -79,7 +79,7 @@ void CSendImageShack::SendThread() {
if(url && *url){
mir_free(m_URL), m_URL=mir_strdup(url);
mir_free(m_URLthumb), m_URLthumb=mir_strdup(m_URL);
- int extlen;
+ size_t extlen;
char* pos=strrchr(m_URLthumb,'.');
if(pos && (extlen=mir_strlen(pos))>2){
char* tmp=mir_strdup(pos);
diff --git a/plugins/SendScreenshotPlus/src/UMainForm.cpp b/plugins/SendScreenshotPlus/src/UMainForm.cpp
index 8cf2a967ce..df0a22f699 100644
--- a/plugins/SendScreenshotPlus/src/UMainForm.cpp
+++ b/plugins/SendScreenshotPlus/src/UMainForm.cpp
@@ -41,36 +41,22 @@ void TfrmMain::Unload(){
}
//---------------------------------------------------------------------------
-INT_PTR CALLBACK TfrmMain::DlgProc_CaptureWindow(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
+INT_PTR CALLBACK TfrmMain::DlgProc_CaptureTabPage(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
// main message handling is done inside TfrmMain::DlgTfrmMain
switch (uMsg) {
case WM_INITDIALOG:
- Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSTARGET));
- SetDlgItemText(hDlg, ID_edtCaption, TranslateT("Drag&Drop the target on the desired window."));
- break;
- case WM_CTLCOLORDLG:
- case WM_CTLCOLOREDIT:
- case WM_CTLCOLORSTATIC:
- SetTextColor((HDC)wParam,GetSysColor(COLOR_WINDOWTEXT));
- return (INT_PTR)GetStockObject(WHITE_BRUSH);
- case WM_COMMAND:
- SendMessage(GetParent(hDlg), uMsg, wParam, lParam);
- break;
- case WM_NOTIFY:
- SendMessage(GetParent(hDlg), uMsg, wParam, lParam);
- break;
- case WM_DESTROY:
- break;
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-INT_PTR CALLBACK TfrmMain::DlgProc_CaptureDesktop(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
-// main message handling is done inside TfrmMain::DlgTfrmMain
- switch (uMsg) {
- case WM_INITDIALOG:
- Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSMONITOR));
+ switch(lParam){
+ case IDD_UMain_CaptureWindow:
+ Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSTARGET));
+ SetDlgItemText(hDlg, ID_edtCaption, TranslateT("Drag&Drop the target on the desired window."));
+ break;
+ case IDD_UMain_CaptureDesktop:
+ Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSMONITOR));
+ break;
+ case IDD_UMain_CaptureFile:
+ Static_SetIcon(GetDlgItem(hDlg, ID_imgTarget), Skin_GetIcon(ICO_COMMON_SSWINDOW1));
+ break;
+ }
break;
case WM_CTLCOLORDLG:
case WM_CTLCOLOREDIT:
@@ -78,6 +64,23 @@ INT_PTR CALLBACK TfrmMain::DlgProc_CaptureDesktop(HWND hDlg, UINT uMsg, WPARAM w
SetTextColor((HDC)wParam,GetSysColor(COLOR_WINDOWTEXT));
return (INT_PTR)GetStockObject(WHITE_BRUSH);
case WM_COMMAND:
+ if(HIWORD(wParam)==BN_CLICKED && LOWORD(wParam)==ID_btnExplore){ /// local file tab
+ OPENFILENAME ofn={sizeof(OPENFILENAME)};
+ TCHAR filename[MAX_PATH];
+ GetDlgItemText(hDlg,ID_edtSize,filename,MAX_PATH);
+ ofn.lStructSize = sizeof(ofn);
+ ofn.hwndOwner = hDlg;
+ ofn.lpstrFilter = _T("Images\0*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.tif;*.tiff\0");
+ ofn.nFilterIndex = 1;
+ ofn.lpstrFile = filename;
+ ofn.nMaxFile = MAX_PATH;
+// ofn.lpstrInitialDir = m_FDestFolder;
+ ofn.Flags = OFN_FILEMUSTEXIST | OFN_READONLY;
+ if(GetOpenFileName(&ofn)){
+ SetDlgItemText(hDlg,ID_edtSize,filename);
+ }
+ break;
+ }
SendMessage(GetParent(hDlg), uMsg, wParam, lParam);
break;
case WM_NOTIFY:
@@ -176,21 +179,21 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) {
chkTimedClick(); //enable disable Timed controls
//create Image list for tab control
- if(m_himlTab == 0){
+ if(!m_himlTab){
//m_himlTab = ImageList_Create(16, 16, PluginConfig.m_bIsXP ? ILC_COLOR32 | ILC_MASK : ILC_COLOR8 | ILC_MASK, 2, 0);
m_himlTab = ImageList_Create(16, 16, ILC_COLOR32 | ILC_MASK, 2, 0);
- ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2));
- ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2));
+ ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2)); /// @note : use custom icon for each capture tab?
+// ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2));
+// ImageList_AddIcon(m_himlTab, Skin_GetIcon(ICO_COMMON_SSWINDOW2));
}
//create the tab control.
{
- TAB_INFO itab;
+ TAB_INFO itab={};
RECT rcClient, rcTab;
m_hwndTab = GetDlgItem(m_hWnd, IDC_CAPTURETAB);
TabCtrl_SetItemExtra(m_hwndTab, sizeof(TAB_INFO) - sizeof(TCITEMHEADER));
- ZeroMemory(&itab, sizeof(itab));
itab.hwndMain = m_hWnd;
itab.hwndTab = m_hwndTab;
@@ -203,19 +206,17 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) {
itab.tcih.mask = TCIF_PARAM|TCIF_TEXT|TCIF_IMAGE;
itab.tcih.pszText = TranslateT("Window");
- itab.tcih.iImage = 0;
- itab.hwndTabPage = CreateDialog(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureWindow), m_hWnd,DlgProc_CaptureWindow);
+// itab.tcih.iImage = 0;
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureWindow), m_hWnd,DlgProc_CaptureTabPage,IDD_UMain_CaptureWindow);
TabCtrl_InsertItem(m_hwndTab, 0, &itab);
MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
- ShowWindow(itab.hwndTabPage, SW_HIDE);
CheckDlgButton(itab.hwndTabPage, ID_chkClientArea, m_opt_chkClientArea ? BST_CHECKED : BST_UNCHECKED);
itab.tcih.pszText = TranslateT("Desktop");
- itab.tcih.iImage = 1;
- itab.hwndTabPage = CreateDialog(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureDesktop), m_hWnd, DlgProc_CaptureDesktop);
+// itab.tcih.iImage = 1;
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureDesktop), m_hWnd, DlgProc_CaptureTabPage,IDD_UMain_CaptureDesktop);
TabCtrl_InsertItem(m_hwndTab, 1, &itab);
MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
- ShowWindow(itab.hwndTabPage, SW_HIDE);
hCtrl = GetDlgItem(itab.hwndTabPage, ID_edtCaption);
ComboBox_ResetContent(hCtrl);
@@ -235,6 +236,12 @@ void TfrmMain::wmInitdialog(WPARAM wParam, LPARAM lParam) {
}
PostMessage(m_hWnd, WM_COMMAND, MAKEWPARAM(ID_edtCaption, CBN_SELCHANGE),(LPARAM)hCtrl);
+ itab.tcih.pszText = TranslateT("File");
+// itab.tcih.iImage = 2;
+ itab.hwndTabPage = CreateDialogParam(hInst,MAKEINTRESOURCE(IDD_UMain_CaptureFile), m_hWnd, DlgProc_CaptureTabPage,IDD_UMain_CaptureFile);
+ TabCtrl_InsertItem(m_hwndTab, 2, &itab);
+ MoveWindow(itab.hwndTabPage, (rcTab.left - rcClient.left)+2, (rcTab.top - rcClient.top), (rcTab.right - rcTab.left) - 2*5, (rcTab.bottom - rcTab.top) - 2*20, TRUE);
+
//select tab and set m_hwndTabPage
TabCtrl_SetCurSel(m_hwndTab, m_opt_tabCapture);
ZeroMemory(&itab, sizeof(itab));
@@ -518,23 +525,21 @@ void TfrmMain::wmTimer(WPARAM wParam, LPARAM lParam){
case 1:
m_Screenshot = CaptureMonitor((m_opt_cboxDesktop > 0) ? m_Monitors[m_opt_cboxDesktop-1].szDevice : NULL);
break;
+ case 2: /// edge case, existing local file
+ break;
+ #ifdef _DEBUG
default:
- KillTimer(m_hWnd,ID_chkTimed);
- m_bCapture = false;
- #ifdef _DEBUG
- OutputDebugStringA("SS Bitmap Timer Stop (no tabCapture)\r\n" );
- #endif
- return;
+ OutputDebugStringA("SS Bitmap Timer Stop (no tabCapture)\r\n" );
+ #endif
}
- if (!m_Screenshot) m_bCapture = false;
- }
- if (m_Screenshot) {
- KillTimer(m_hWnd,ID_chkTimed);
m_bCapture = false;
- #ifdef _DEBUG
- OutputDebugStringA("SS Bitmap Timer Stop (CaptureDone)\r\n" );
- #endif
- SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone);
+ if (m_Screenshot || m_opt_tabCapture==2) { /// @note : test without "if"
+ KillTimer(m_hWnd,ID_chkTimed);
+ #ifdef _DEBUG
+ OutputDebugStringA("SS Bitmap Timer Stop (CaptureDone)\r\n" );
+ #endif
+ SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone);
+ }
}
}
}
@@ -598,7 +603,7 @@ void TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) {
//HWND hWnd = (HWND)wParam;
switch (lParam) {
case EVT_CaptureDone:
- if (!m_Screenshot) {
+ if (!m_Screenshot && m_opt_tabCapture!=2) {
TCHAR *err = TranslateT("Can't create a Screenshot");
MessageBox(m_hWnd,err,ERROR_TITLE,MB_OK|MB_ICONWARNING);
Show();
@@ -618,9 +623,7 @@ void TfrmMain::UMevent(WPARAM wParam, LPARAM lParam) {
*/
return;
}
- else {
- FormClose();
- }
+ FormClose();
break;
case EVT_SendFileDone:
break;
@@ -752,25 +755,36 @@ void TfrmMain::btnCaptureClick() {
m_bFormEdit = false; //until UEditForm is includet
if(m_opt_tabCapture==1) m_hTargetWindow=GetDesktopWindow();
- else if(!m_hTargetWindow) {
+ else if(m_opt_tabCapture==2){
+ TCHAR filename[MAX_PATH];
+ GetDlgItemText(m_hwndTabPage, ID_edtSize, filename, MAX_PATH);
+ FILE* fp=_wfopen(filename,_T("rb"));
+ if(!fp){
+ TCHAR *err = TranslateT("Select a file");
+ MessageBox(m_hWnd,err,ERROR_TITLE,MB_OK|MB_ICONWARNING);
+ return;
+ }
+ fclose(fp);
+ mir_free(m_pszFile); m_pszFile=mir_tstrdup(filename);
+ }else if(!m_hTargetWindow) {
TCHAR *err = TranslateT("Select a target window.");
MessageBox(m_hWnd,err,ERROR_TITLE,MB_OK|MB_ICONWARNING);
return;
}
TfrmMain::Hide();
-
- if (m_opt_chkTimed) {
- SetTimer(m_hWnd, ID_chkTimed, m_opt_edtTimed ? m_opt_edtTimed*1000 : 500, NULL);
+ if(m_opt_chkTimed){
+ SetTimer(m_hWnd, ID_chkTimed, m_opt_edtTimed ? m_opt_edtTimed*1000 : 500, NULL); /// calls EVT_CaptureDone
+ return;
}
- else if (m_opt_tabCapture == 1){
- //desktop need always time to update from TfrmMain::Hide()
- SetTimer(m_hWnd, ID_chkTimed, 500, NULL);
+ if(m_opt_tabCapture==1){ /// desktop needs always time to update from TfrmMain::Hide()
+ SetTimer(m_hWnd, ID_chkTimed, 500, NULL); /// calls EVT_CaptureDone
+ return;
}
- else {
+ if(m_opt_tabCapture!=2){
m_Screenshot = CaptureWindow(m_hTargetWindow, m_opt_chkClientArea);
- SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone);
}
+ SendMessage(m_hWnd,UM_EVENT, 0, (LPARAM)EVT_CaptureDone);
}
//---------------------------------------------------------------------------
@@ -1046,13 +1060,13 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) {
if(ret){
db_set_dw(NULL,SZ_SENDSS,"FileNumber",FileNumber);
- mir_freeAndNil(m_pszFile); m_pszFile=ret;
- mir_freeAndNil(m_pszFileDesc);
+ mir_free(m_pszFile); m_pszFile=ret;
+ mir_free(m_pszFileDesc);
if(IsWindowEnabled(GetDlgItem(m_hWnd,ID_btnDesc)) && m_opt_btnDesc){
m_pszFileDesc=pszFileDesc;
}else{
mir_free(pszFileDesc);
- mir_tcsadd(m_pszFileDesc, _T(""));
+ m_pszFileDesc=mir_tstrdup(_T(""));
}
if(m_cSend) {
@@ -1067,9 +1081,17 @@ INT_PTR TfrmMain::SaveScreenshot(FIBITMAP* dib) {
//---------------------------------------------------------------------------
void TfrmMain::FormClose() {
-
- // Saving the screenshot
- if (SaveScreenshot(m_Screenshot)) {
+ if(m_opt_tabCapture==2){ /// existing file
+ TCHAR description[1024];
+ GetDlgItemText(m_hwndTabPage, ID_edtCaption, description, 1024);
+ if(!IsWindowEnabled(GetDlgItem(m_hWnd,ID_btnDesc)) || !m_opt_btnDesc)
+ *description='\0';
+ if(m_cSend) {
+ m_cSend->m_bDeleteAfterSend = false; /// well... guess it's better to not delete existing files for now...
+ m_cSend->SetFile(m_pszFile);
+ m_cSend->SetDescription(description);
+ }
+ }else if(SaveScreenshot(m_Screenshot)){ /// Saving the screenshot
Show(); // Error from SaveScreenshot
return;
}
diff --git a/plugins/SendScreenshotPlus/src/UMainForm.h b/plugins/SendScreenshotPlus/src/UMainForm.h
index ea4b61e15e..33f790a6d9 100644
--- a/plugins/SendScreenshotPlus/src/UMainForm.h
+++ b/plugins/SendScreenshotPlus/src/UMainForm.h
@@ -118,7 +118,7 @@ class TfrmMain{
bool m_opt_btnDeleteAfterSend; //TCheckBox *chkDeleteAfterSend;
BYTE m_opt_cboxFormat; //TComboBox *cboxFormat;
BYTE m_opt_edtTimed; //TLabeledEdit *edtTimed;
- bool m_bCapture; //is capture activ
+ bool m_bCapture; //is capture active
HWND m_hwndTab; //TabControl handle
HWND m_hwndTabPage; //TabControl activ page handle
HIMAGELIST m_himlTab; //TabControl imagelist
@@ -136,8 +136,7 @@ class TfrmMain{
void UMevent(WPARAM wParam, LPARAM lParam);
void UMClosing(WPARAM wParam, LPARAM lParam);
- static INT_PTR CALLBACK DlgProc_CaptureWindow (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
- static INT_PTR CALLBACK DlgProc_CaptureDesktop(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
+ static INT_PTR CALLBACK DlgProc_CaptureTabPage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
// LRESULT CALLBACK DlgProc_UseLastFile (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
diff --git a/plugins/SendScreenshotPlus/src/mir_string.h b/plugins/SendScreenshotPlus/src/mir_string.h
index a8dc50e776..d5c33fe1a3 100644
--- a/plugins/SendScreenshotPlus/src/mir_string.h
+++ b/plugins/SendScreenshotPlus/src/mir_string.h
@@ -1,49 +1,50 @@
-/*
-Miranda NG: the free IM client for Microsoft* Windows*
-
-Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org),
-Copyright (c) 2000-09 Miranda ICQ/IM project,
-
-This file is part of Send Screenshot Plus, a Miranda IM plugin.
-Copyright (c) 2010 Ing.U.Horn
-
-Parts of this file based on original sorce code
-from UserInfoEx Plugin
-
-This program is free software; you can redistribute it and/or
-modify it under the terms of the GNU General Public License
-as published by the Free Software Foundation; either version 2
-of the License, or (at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#ifndef _MIR_STRING_H_INCLUDED_
-#define _MIR_STRING_H_INCLUDED_
-
-#define mir_tcslen mir_wcslen
-#define mir_tcsadd mir_wcsadd
-#define mir_tcsncpy mir_wcsncpy
-#define mir_tcsncat mir_wcsncat
-
-#define mir_strlen(s) (((s)!=0)?strlen(s):0)
-#define mir_strcpy(d,s) (((s)!=0&&(d)!=0)?strcpy(d,s):0)
-
-#define mir_wcslen(s) (((s)!=0)?wcslen(s):0)
-
-#define mir_freeAndNil(ptr) mir_free(ptr),ptr=NULL
-
-wchar_t* mir_wcsncpy(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest);
-wchar_t* mir_wcsncat(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest);
-
-void mir_stradd(char* &pszDest, const char* pszSrc);
-void mir_wcsadd(wchar_t* &pszDest, const wchar_t* pszSrc);
-
-#endif /* _MIR_STRING_H_INCLUDED_ */ \ No newline at end of file
+/*
+Miranda NG: the free IM client for Microsoft* Windows*
+
+Copyright (c) 2012-14 Miranda NG project (http://miranda-ng.org),
+Copyright (c) 2000-09 Miranda ICQ/IM project,
+
+This file is part of Send Screenshot Plus, a Miranda IM plugin.
+Copyright (c) 2010 Ing.U.Horn
+
+Parts of this file based on original sorce code
+from UserInfoEx Plugin
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifndef _MIR_STRING_H_INCLUDED_
+#define _MIR_STRING_H_INCLUDED_
+
+#define mir_tcslen mir_wcslen
+#define mir_tcsadd mir_wcsadd
+#define mir_tcsncpy mir_wcsncpy
+#define mir_tcsncat mir_wcsncat
+#define mir_tstrdup mir_wstrdup
+
+#define mir_strlen(s) (((s)!=0)?strlen(s):0)
+#define mir_strcpy(d,s) (((s)!=0&&(d)!=0)?strcpy(d,s):0)
+
+#define mir_wcslen(s) (((s)!=0)?wcslen(s):0)
+
+#define mir_freeAndNil(ptr) mir_free(ptr),ptr=NULL
+
+wchar_t* mir_wcsncpy(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest);
+wchar_t* mir_wcsncat(wchar_t* pszDest, const wchar_t* pszSrc, const size_t cchDest);
+
+void mir_stradd(char* &pszDest, const char* pszSrc);
+void mir_wcsadd(wchar_t* &pszDest, const wchar_t* pszSrc);
+
+#endif /* _MIR_STRING_H_INCLUDED_ */
diff --git a/plugins/SendScreenshotPlus/src/resource.h b/plugins/SendScreenshotPlus/src/resource.h
index af67a83858..5c5dca91ae 100644
--- a/plugins/SendScreenshotPlus/src/resource.h
+++ b/plugins/SendScreenshotPlus/src/resource.h
@@ -20,9 +20,10 @@
#define IDD_UMainForm 101
#define IDD_UMain_CaptureWindow 102
#define IDD_UMain_CaptureDesktop 103
-#define IDD_UEditForm 104
-#define IDD_UAboutForm 105
-#define IDD_UResultForm 106
+#define IDD_UMain_CaptureFile 104
+#define IDD_UEditForm 105
+#define IDD_UAboutForm 106
+#define IDD_UResultForm 107
#define IDD_MSGBOX 110
#define IDD_MSGBOXDUMMI 111
#define IDR_LICENSE 120