如何从c ++代码转换delphi代码

时间:2017-05-04 12:26:55

标签: delphi

我知道我会为此投票。但我仍然发布这个问题

任何一个请在delphi中转换以下两个函数代码。

#include <windows.h>
#include "multimon.h"    

#define MONITOR_CENTER     0x0001        // center rect to monitor 
#define MONITOR_CLIP     0x0000        // clip rect to monitor 
#define MONITOR_WORKAREA 0x0002        // use monitor work area 
#define MONITOR_AREA     0x0000        // use monitor entire area 

// 
//  ClipOrCenterRectToMonitor 
// 
//  The most common problem apps have when running on a 
//  multimonitor system is that they "clip" or "pin" windows 
//  based on the SM_CXSCREEN and SM_CYSCREEN system metrics. 
//  Because of app compatibility reasons these system metrics 
//  return the size of the primary monitor. 
// 
//  This shows how you use the multi-monitor functions 
//  to do the same thing.    

    void ClipOrCenterRectToMonitor(LPRECT prc, UINT flags)
    {
        HMONITOR hMonitor;
        MONITORINFO mi;
        RECT        rc;
        int         w = prc->right  - prc->left;
        int         h = prc->bottom - prc->top;

        // 
        // get the nearest monitor to the passed rect. 
        // 
        hMonitor = MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST);

        // 
        // get the work area or entire monitor rect. 
        // 
        mi.cbSize = sizeof(mi);
        GetMonitorInfo(hMonitor, &mi);

        if (flags & MONITOR_WORKAREA)
            rc = mi.rcWork;
        else
            rc = mi.rcMonitor;

        // 
        // center or clip the passed rect to the monitor rect 
        // 
        if (flags & MONITOR_CENTER)
        {
            prc->left   = rc.left + (rc.right  - rc.left - w) / 2;
            prc->top    = rc.top  + (rc.bottom - rc.top  - h) / 2;
            prc->right  = prc->left + w;
            prc->bottom = prc->top  + h;
        }
        else
        {
            prc->left   = max(rc.left, min(rc.right-w,  prc->left));
            prc->top    = max(rc.top,  min(rc.bottom-h, prc->top));
            prc->right  = prc->left + w;
            prc->bottom = prc->top  + h;
        }
    }

    void ClipOrCenterWindowToMonitor(HWND hwnd, UINT flags)
    {
        RECT rc;
        GetWindowRect(hwnd, &rc);
        ClipOrCenterRectToMonitor(&rc, flags);
        SetWindowPos(hwnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
    }
流着我试过:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure ClipOrCenterRectToMonitor(prc:Integer ; flags:UINT );
   type
  HMONITOR = type THandle;
 var

   // hMonitor : HMONITOR ;
    mi : MONITORINFO ;
    rc : RECT        ;
    w : Integer;
    h :  Integer;

 begin
     w := prc->right  - prc->left;
     h := prc->bottom - prc->top;


    //
    // get the nearest monitor to the passed rect.
    //
    hMonitor := MonitorFromRect(prc, MONITOR_DEFAULTTONEAREST);

    //
    // get the work area or entire monitor rect.
    //
    mi.cbSize := sizeof(mi);
    GetMonitorInfo(hMonitor, &mi);

    if (flags & MONITOR_WORKAREA) then
        rc := mi.rcWork;
    else
        rc := mi.rcMonitor;

    //
    // center or clip the passed rect to the monitor rect
    //
    if (flags & MONITOR_CENTER) then
    begin
        prc->left   := rc.left + (rc.right  - rc.left - w) / 2;
        prc->top    := rc.top  + (rc.bottom - rc.top  - h) / 2;
        prc->right  := prc->left + w;
        prc->bottom := prc->top  + h;
    end;
    else
    begin
        prc->left   := max(rc.left, min(rc.right-w,  prc->left));
        prc->top    := max(rc.top,  min(rc.bottom-h, prc->top));
        prc->right  := prc->left + w;
        prc->bottom := prc->top  + h;
    end;
  end;

procedure ClipOrCenterWindowToMonitor(hwand:HWND; flags:UINT);
var
  rd:RECT ;
 begin

    GetWindowRect(hwnd, &rc);
    ClipOrCenterRectToMonitor(&rc, flags);
    SetWindowPos(hwnd, NULL, rc.left, rc.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
   end;




end.

但这不完整。请任何人这样做。

1 个答案:

答案 0 :(得分:5)

这里是您用作基础的MSDN文章Positioning Objects on a Multiple Display Setup (Windows)中C代码的直接翻译。它在D2007和Delphi Berlin上都没有错误或警告编译,虽然我还没有对它进行测试,看看MSDN代码是否真的有效。

var db=new PouchDB('company_details');
function dumpdata(){
  var ws = fs.createWriteStream('file:///C:/xampp/htdocs/sevenadmin/db/output.txt');

  db.dump(ws).then(function (res) {
    //res should be {ok: true}
 }); 
}