MFC エディットコントロールの高さを、文字列や横幅にあわせて自動的に変更する

GetWindowRect()で情報を得る

void ChangeEdit2Height(){
    // 文字列の取得
    CString strBuff;
    int nstrLen = ce2.GetWindowTextLength() + 2;
    ce2.GetWindowText(strBuff.GetBuffer(nstrLen), nstrLen);
    strBuff.ReleaseBuffer();

    // IDC_Edit2のサイズ変更
    CDCHandle cdcE2(ce2.GetDC());   // デストラクタでリリースされない
    cdcE2.SelectFont(ce2.GetFont());    // フォントをコントロールに会わせる

    CRect rc2W, rc2R;   // ウィンドウRectと、フォーマット領域Rect
    ce2.GetWindowRect(&rc2W);   this->ScreenToClient(&rc2W);
    ce2.GetRect(&rc2R);
    rc2W.bottom += -rc2R.Height() + cdcE2.DrawText(strBuff, -1, &rc2R, DT_EDITCONTROL | DT_WORDBREAK | DT_NOPREFIX | DT_CALCRECT);
    if(rc2R.Height() != 0) ce2.MoveWindow(&rc2W); // 0pxで更新すると、rc2Rの高さがあるのでおかしくなる

    ce2.ReleaseDC(cdcE2);
    return;
}

高DPI対策 OS任せにする方法

Windows Vista以降だとDPI仮想化機能がありますので、未対応アプリケーションでもとりあえず使用できる。

いざとなれば、ファイルのプロパティから「高DPI設定では画面のスケーリングを無効にする」を選択することでDPI仮想化をキャンセルすることが可能。
f:id:shikaku:20170926130804p:plain

Windows 10 Creator's Updateでは仮想DPIが賢くなったのでOS任せでもある程度解決します。

高DPI対応調査 96 DPI ピクセルを想定しているデザインをどれだけスケーリングするか調べる

// 96 DPI ピクセルを想定しているデザインをどれだけスケーリングするか
double scaleX;
double scaleY;
#define SCALEX(argX) ((int) ((argX) * scaleX))
#define SCALEY(argY) ((int) ((argY) * scaleY))

void InitScaling() {
   HDC screen = GetDC(0);
   scaleX = GetDeviceCaps(screen, LOGPIXELSX) / 96.0;
   scaleY = GetDeviceCaps(screen, LOGPIXELSY) / 96.0;
   ReleaseDC(0, screen);
}

フォントのポイント数からドット数を計算する

${フォントのポイント数} × ${利用ディスプレイのDPI} ÷ 72 = ${フォント表示のドット数(高さ)}
  • (Win32APIの)CreateFont は、ポイントで指定する
  • 1ポイント = 1/72インチ
  • DPI(dot per inch)は、画面設定によって異なる
  • 標準的な画面設定では、96dpi

Excel VBA(エクセル マクロ) 外部データの取り込みのマクロ化 Webデータ(ホームページファイル)の取得。 Excelツールで外部データの取り込みがある。 VBAでマクロ化して、Excelにファイル名を変更して読み込むようにする。

QueryTablesを使う

  With Sheets("取り込みデータ").QueryTables.Add(Connection:="URL;" & url, Destination:=Sheets("取り込みデータ").Range("A1"))
    .Name = "test"
    .FieldNames = True
    .RowNumbers = False
    .Refresh BackgroundQuery:=False
    .RefreshPeriod = 0
    .RefreshOnFileOpen = False
    .PreserveFormatting = True
    .AdjustColumnWidth = True
    .FillAdjacentFormulas = False
    .RefreshStyle = xlInsertEntireRows
    .SavePassword = False
    .SaveData = True
    .WebSelectionType = xlAllTables
    .WebFormatting = xlWebFormattingNone
    .WebPreFormattedTextToColumns = True
    .WebConsecutiveDelimitersAsOne = True
    .WebSingleBlockTextImport = False
    .WebDisableDateRecognition = False
    .WebDisableRedirections = True
    .Refresh
    .Parent.Names(.Name).Delete
    .Delete
  End With

64bit Windowsを前提とした32bitアプリケーション延命法 ~ LAAオプションで32bitアプリケーションのメモリ不足問題を解消

32bitアプリは普通2Gしかメモリ割り当てられない。

VisualStudioで
構成プロパティ → リンカー → システム → 大きいサイズのアドレス
を「はい」を選ぶと64bitOSの場合、アプリで4Gのメモリが利用できるようになる。

32bitOSの場合は3GBスイッチを使ってもらうしかない。


BackWPupがエラーが出るようになったなら、UpdraftPlusが代替候補

いつのまにかエラーになってバックアップが作られなくなってるサーバーがあった。

サーバー依存だったのでなにか差があるのでしょう。


UpdraftPlusを使うとDropbox上にバックアップできるのでよさげ。