Skip to content

Instantly share code, notes, and snippets.

@hirosof
Created August 11, 2013 07:31
Show Gist options
  • Save hirosof/6203882 to your computer and use it in GitHub Desktop.
Save hirosof/6203882 to your computer and use it in GitHub Desktop.
HSInternalData
#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;
}
#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