Created
August 11, 2013 07:31
-
-
Save hirosof/6203882 to your computer and use it in GitHub Desktop.
HSInternalData
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include "HSInternalData.h" | |
CHSInternalDataAdmin::CHSInternalDataAdmin() | |
{ | |
this->lpData = NULL; | |
} | |
CHSInternalDataAdmin::~CHSInternalDataAdmin() | |
{ | |
this->AllDestroy(); | |
} | |
/* | |
private メンバ関数 | |
*/ | |
//新しい設定の位置を確保 | |
LPHSInternalData CHSInternalDataAdmin::AllocNewSettingMemory(void){ | |
LPHSInternalData lpNewData; | |
LPHSInternalData lpClassData = this->lpData; | |
lpNewData = new HSInternalData; | |
memset(lpNewData , 0 , sizeof(HSInternalData)); | |
if(!this->lpData){ | |
this->lpData = lpNewData; | |
}else{ | |
while(lpClassData->lpNext) lpClassData = lpClassData->lpNext; | |
lpClassData->lpNext = lpNewData; | |
lpNewData->lpBack = lpClassData; | |
} | |
return lpNewData; | |
} | |
//指定されたコントロールを管理しているメモリのアドレスを確認する | |
LPHSInternalData CHSInternalDataAdmin::GetSettingMemory(HWND hObject){ | |
if(!hObject || !this->lpData) return NULL; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
if(lpClassData->Data.hControl == hObject) | |
return lpClassData; | |
} while (lpClassData = lpClassData->lpNext); | |
return NULL; | |
} | |
/* | |
public メンバ関数 | |
*/ | |
//指定されたオブジェクトを管理しているかを取得 | |
BOOL CHSInternalDataAdmin::IsAdminObject(HWND hwnd){ | |
return (this->GetSettingMemory(hwnd)) ? TRUE : FALSE; | |
} | |
// データ追加 | |
void CHSInternalDataAdmin::Add(LPHSControlData lpAddData){ | |
if(!lpAddData) return; | |
LPHSInternalData lpMData = this->AllocNewSettingMemory(); | |
memcpy(&lpMData->Data , lpAddData , sizeof(HSControlData)); | |
} | |
//コントロール破棄 | |
void CHSInternalDataAdmin::Destroy(HWND hObject){ | |
if(!hObject) return; | |
LPHSInternalData lpDData = this->GetSettingMemory(hObject); | |
if(!lpDData) return; | |
DestroyWindow(lpDData->Data.hControl); | |
if(lpDData->lpBack)lpDData->lpBack->lpNext = lpDData->lpNext; | |
if(lpDData->lpNext) lpDData->lpNext->lpBack = lpDData->lpBack; | |
if(lpDData == lpData)lpData = lpData->lpNext; | |
delete lpDData; | |
} | |
//選択されているコントロール破棄 | |
void CHSInternalDataAdmin::DestroyForSelectedObjects(void){ | |
int nums = this->GetSelectedObjectsCount(); | |
if(nums){ | |
HWND *lpHandle = new HWND[nums]; | |
this->GetSelectedObjects(lpHandle); | |
for (int i = 0; i < nums; i++) | |
{ | |
this->Destroy(*(lpHandle + i)); | |
} | |
delete []lpHandle; | |
} | |
} | |
//全コントロール破棄 | |
void CHSInternalDataAdmin::AllDestroy(void){ | |
if(!this->lpData) return; | |
//最後の位置に移動 | |
LPHSInternalData lpClassData = this->lpData; | |
while(lpClassData->lpNext) lpClassData = lpClassData->lpNext; | |
//前のデータのアドレス | |
LPHSInternalData oldad = NULL; | |
//破棄しながら前のデータに移動する | |
do{ | |
oldad = lpClassData->lpBack; | |
SetWindowLong(lpClassData->Data.hControl , GWL_WNDPROC , reinterpret_cast<LONG>(lpClassData->Data.OldProc)); | |
DestroyWindow(lpClassData->Data.hControl); | |
delete lpClassData; | |
}while(lpClassData = oldad); | |
this->lpData = NULL; | |
} | |
//取得 | |
BOOL CHSInternalDataAdmin::GetInfo(LPHSControlData lpInfo){ | |
if(!lpInfo) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(lpInfo->hControl); | |
if(!lpAdminInfo) return 0; | |
memcpy(lpInfo , &lpAdminInfo->Data , sizeof(HSControlData)); | |
return TRUE; | |
} | |
//設定 | |
BOOL CHSInternalDataAdmin::SetInfo(LPHSControlData lpInfo){ | |
if(!lpInfo) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(lpInfo->hControl); | |
if(!lpAdminInfo) return 0; | |
memcpy(&lpAdminInfo->Data , lpInfo , sizeof(HSControlData)); | |
return TRUE; | |
} | |
//プレビューモード取得 | |
BOOL CHSInternalDataAdmin::GetPreviewMode(HWND hwnd){ | |
if(!hwnd) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(hwnd); | |
if(!lpAdminInfo) return 0; | |
return lpAdminInfo->Data.isPreviewMode; | |
} | |
//プレビューモード設定 | |
BOOL CHSInternalDataAdmin::SetPreviewMode(HWND hwnd , BOOL bMode){ | |
if(!hwnd) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(hwnd); | |
if(!lpAdminInfo) return 0; | |
lpAdminInfo->Data.isPreviewMode = bMode; | |
return 1; | |
} | |
//以前のプロシージャのアドレスを取得 | |
WNDPROC CHSInternalDataAdmin::GetOldProc(HWND hwnd){ | |
if(!hwnd) return NULL; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(hwnd); | |
if(!lpAdminInfo) return NULL; | |
return lpAdminInfo->Data.OldProc; | |
} | |
//オブジェクトが選択されているかの設定 | |
BOOL CHSInternalDataAdmin::SetSelected(HWND hwnd , BOOL bSelected){ | |
if(!hwnd) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(hwnd); | |
if(!lpAdminInfo) return 0; | |
lpAdminInfo->Data.isSelected = bSelected; | |
return 1; | |
} | |
//オブジェクトが選択されているかの設定取得 | |
BOOL CHSInternalDataAdmin::GetSelected(HWND hwnd){ | |
if(!hwnd) return 0; | |
LPHSInternalData lpAdminInfo = this->GetSettingMemory(hwnd); | |
if(!lpAdminInfo) return 0; | |
return lpAdminInfo->Data.isSelected; | |
} | |
//選択されているオブジェクトを変更する | |
BOOL CHSInternalDataAdmin::ChangeSelectObject(HWND hwnd , BOOL bOK_Multi){ | |
int NumOldSelect; | |
if(!hwnd) return 0; | |
if(!bOK_Multi){ | |
if(NumOldSelect = this->GetSelectedObjectsCount()){ | |
HWND *lph_Wnd = new HWND[NumOldSelect]; | |
this->GetSelectedObjects(lph_Wnd); | |
for (int i = 0; i < NumOldSelect; i++) | |
{ | |
this->SetSelected(*(lph_Wnd + i) , FALSE); | |
} | |
delete []lph_Wnd; | |
} | |
} | |
this->SetSelected(hwnd , TRUE); | |
return TRUE; | |
} | |
//すべてのオブジェクトを選択状態にする | |
BOOL CHSInternalDataAdmin::SetAllSelect(void){ | |
if(!this->lpData) return NULL; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
lpClassData->Data.isSelected = TRUE; | |
} while (lpClassData = lpClassData->lpNext); | |
return TRUE; | |
} | |
//選択されているオブジェクトの数を数える | |
int CHSInternalDataAdmin::GetSelectedObjectsCount(void){ | |
int NumberOfSelectedItem = 0; | |
if(!this->lpData) return 0; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
if(lpClassData->Data.isSelected) NumberOfSelectedItem++; | |
} while (lpClassData = lpClassData->lpNext); | |
return NumberOfSelectedItem; | |
} | |
//選択されている全オブジェクトの配列を返す | |
int CHSInternalDataAdmin::GetSelectedObjects(HWND *lpObjectHandles){ | |
int NumberOfSelectedItem = 0; | |
if(!this->lpData || !lpObjectHandles) return 0; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
if(lpClassData->Data.isSelected){ | |
*(lpObjectHandles + NumberOfSelectedItem) = lpClassData->Data.hControl; | |
NumberOfSelectedItem++; | |
} | |
} while (lpClassData = lpClassData->lpNext); | |
return NumberOfSelectedItem; | |
} | |
//コントロールの数を数える | |
int CHSInternalDataAdmin::GetNumberOfControls(TCHAR *lpszContorlName){ | |
int NumberOfItems = 0; | |
if(!this->lpData) return 0; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
if(lpszContorlName){ | |
if(!lstrcmp(lpszContorlName , lpClassData->Data.szControlName)) | |
NumberOfItems++; | |
}else NumberOfItems++; | |
} while (lpClassData = lpClassData->lpNext); | |
return NumberOfItems; | |
} | |
//コントロール番号の最大値を取得 | |
int CHSInternalDataAdmin::GetMaxControlNumber(TCHAR *lpszContorlName){ | |
UINT32 NumberOfMaxID = 0; | |
int NumberOfItems = 0; | |
if(!this->lpData) return -1; | |
LPHSInternalData lpClassData = this->lpData; | |
do | |
{ | |
if(lpszContorlName){ | |
if(!lstrcmp(lpszContorlName , lpClassData->Data.szControlName)){ | |
NumberOfItems++; | |
if(NumberOfMaxID < lpClassData->Data.ControlNumber) | |
NumberOfMaxID = lpClassData->Data.ControlNumber; | |
} | |
} | |
} while (lpClassData = lpClassData->lpNext); | |
return (NumberOfItems) ? NumberOfMaxID : -1; | |
} | |
//指定されたコントロールの表示領域を取得する | |
BOOL CHSInternalDataAdmin::GetControlRect(HWND hwnd , RECT *lpRect){ | |
if(!hwnd || !lpRect) return FALSE; | |
if(this->GetSettingMemory(hwnd)){ | |
RECT rcTarget; | |
GetWindowRect(hwnd , &rcTarget); | |
POINT ptTarget; | |
ptTarget.x = rcTarget.left; | |
ptTarget.y = rcTarget.top; | |
ScreenToClient(GetParent(hwnd) , &ptTarget); | |
lpRect->left = ptTarget.x; | |
lpRect->top = ptTarget.y; | |
lpRect->right = ptTarget.x + (rcTarget.right - rcTarget.left); | |
lpRect->bottom = ptTarget.y + (rcTarget.bottom - rcTarget.top); | |
return TRUE; | |
} | |
return FALSE; | |
} | |
//指定されたコントロールの位置を取得する | |
BOOL CHSInternalDataAdmin::GetControlPosition(HWND hwnd , POINT *lpPoint){ | |
RECT rt; | |
if(!lpPoint) return FALSE; | |
if(!this->GetControlRect(hwnd , &rt)) return FALSE; | |
lpPoint->x = rt.left; | |
lpPoint->y = rt.top; | |
return TRUE; | |
} | |
//指定されたコントロールのサイズを取得する | |
BOOL CHSInternalDataAdmin::GetControlSize(HWND hwnd , SIZE *lpSize){ | |
RECT rt; | |
if(!lpSize) return FALSE; | |
if(!this->GetControlRect(hwnd , &rt)) return FALSE; | |
lpSize->cx = rt.right - rt.left; | |
lpSize->cy = rt.bottom - rt.top; | |
return TRUE; | |
} | |
//指定されたコントロールの位置を設定する | |
BOOL CHSInternalDataAdmin::SetControlPosition(HWND hwnd , POINT Point){ | |
if(!hwnd) return FALSE; | |
if(this->GetSettingMemory(hwnd)){ | |
return SetWindowPos(hwnd , NULL , Point.x , Point.y , 0 , 0 , SWP_NOSIZE); | |
} | |
return FALSE; | |
} | |
//指定されたコントロールのサイズを設定する | |
BOOL CHSInternalDataAdmin::SetControlSize(HWND hwnd , SIZE Size){ | |
if(!hwnd) return FALSE; | |
if(this->GetSettingMemory(hwnd)){ | |
MINMAXINFO mmi; | |
memset(&mmi , 0 , sizeof(MINMAXINFO)); | |
SendMessage(hwnd , WM_GETMINMAXINFO , NULL , reinterpret_cast<LPARAM>(&mmi)); | |
if(mmi.ptMinTrackSize.x > Size.cx) Size.cx = mmi.ptMinTrackSize.x ; | |
if(mmi.ptMinTrackSize.y > Size.cy) Size.cy = mmi.ptMinTrackSize.y ; | |
return SetWindowPos(hwnd , NULL , 0 ,0, Size.cx , Size.cy , SWP_NOMOVE); | |
} | |
return FALSE; | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <Windows.h> | |
#include <stdio.h> | |
typedef struct HSControlData | |
{ | |
HWND hControl; //コントロール ウィンドウハンドル | |
WNDPROC OldProc; //従来のプロシージャ | |
wchar_t szControlName[260]; //コントロール名 | |
wchar_t szWindowClassName[260]; //ウィンドウクラス名 | |
UINT32 ControlNumber; //種別のコントロール番号 | |
struct{ | |
wchar_t Name[260]; //メニューID(マクロ名) | |
UINT32 ID; //メニューID | |
}MenuID; | |
BOOL isPreviewMode; //プレビューモードかどうか | |
BOOL isSelected; //選択されているか | |
}*LPHSControlData; | |
typedef struct HSInternalData | |
{ | |
HSControlData Data; | |
HSInternalData *lpBack; //前のデータ | |
HSInternalData *lpNext; //次のデータ | |
}*LPHSInternalData; | |
class CHSInternalDataAdmin | |
{ | |
private: | |
LPHSInternalData lpData; //設定 | |
LPHSInternalData AllocNewSettingMemory(void); //新しい設定の位置を確保 | |
LPHSInternalData GetSettingMemory(HWND hwnd); //指定されたコントロールを管理しているメモリのアドレスを確認する | |
public: | |
CHSInternalDataAdmin(); //コンストラクタ | |
~CHSInternalDataAdmin(); //デストラクタ | |
void Add(LPHSControlData lpAddData); //追加 | |
void Destroy(HWND hObject); //コントロール破棄 | |
void DestroyForSelectedObjects(void); //選択されているコントロール破棄 | |
void AllDestroy(void); //全コントロール破棄 | |
BOOL GetInfo(LPHSControlData lpInfo); //取得 | |
BOOL SetInfo(LPHSControlData lpInfo); //設定 | |
BOOL IsAdminObject(HWND hwnd); //指定されたオブジェクトを管理しているかを取得 | |
BOOL GetPreviewMode(HWND hwnd); //プレビューモード取得 | |
BOOL SetPreviewMode(HWND hwnd , BOOL bMode); //プレビューモード設定 | |
WNDPROC GetOldProc(HWND hwnd); //以前のプロシージャのアドレスを取得 | |
BOOL SetSelected(HWND hwnd , BOOL bSelected); //オブジェクトが選択されているかの設定 | |
BOOL GetSelected(HWND hwnd); //オブジェクトが選択されているかの設定取得 | |
BOOL ChangeSelectObject(HWND hwnd , BOOL bOK_Multi = FALSE); //選択されているオブジェクトを変更する | |
BOOL SetAllSelect(void); //すべてのオブジェクトを選択状態にする | |
int GetSelectedObjectsCount(void); //選択されているオブジェクトの数を数える | |
int GetSelectedObjects(HWND *lpObjectHandles); //選択されている全オブジェクトの配列を返す | |
int GetNumberOfControls(TCHAR *lpszContorlName = NULL); //コントロールの数を数える | |
int GetMaxControlNumber(TCHAR *lpszContorlName); //最大のコントロール番号を取得 | |
BOOL GetControlRect(HWND hwnd , RECT *lpRect); //指定されたコントロールの表示領域を取得する | |
BOOL GetControlPosition(HWND hwnd , POINT *lpPoint); //指定されたコントロールの位置を取得する | |
BOOL GetControlSize(HWND hwnd , SIZE *lpSize); //指定されたコントロールのサイズを取得する | |
BOOL SetControlPosition(HWND hwnd , POINT Point); //指定されたコントロールの位置を設定する | |
BOOL SetControlSize(HWND hwnd , SIZE Size); //指定されたコントロールのサイズを設定する | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment