|
Tryhard wrote:
I have played with using edit box, rich edit box and list box all seem to be able to acheive this sort of program one way or another, but which one should I really be using??
Nope! You can not show a flashing cursor on the list box. Using editbox will be simpler than using a richedit. But using rich edit allows you to do more complex operations, such as changing font, color, ...etc.
Kind regards
Mustafa Demirhan
http://www.macroangel.com
Sonork ID 100.9935:zoltrix
|
|
|
|
|
Check out the VCTERM sample in MSDN.
I am currently writing a terminal app, and I have chosen the edit box since it seems to be the easiest control to play with.
You will need to derive your own edit box class to be able to do what you want, but that is shown in the sample.
Cheers,
/Fredrik
Sonork ID: 100.11430:PhatBoy
|
|
|
|
|
Hi, All!!!
=======
Does anyone now how the BitBlt() function works exactly ?
and what do I need to know about SRCCOPY and SRCPAINT and stuff ?
Please help.
Thanks.
BTW: come to #CodeProject on DalNet (mIRC)
|
|
|
|
|
Sagiv wrote:
Does anyone now how the BitBlt() function works exactly ?
What do you mean by 'exactly' ??? If you're doing a SRCCOPY I guess it essentially does a memcpy.
Sagiv wrote:
and what do I need to know about SRCCOPY and SRCPAINT and stuff ?
Here's a list from MSDN
BLACKNESS Turns all output black.
DSTINVERT Inverts the destination bitmap.
MERGECOPY Combines the pattern and the source bitmap using the Boolean AND operator.
MERGEPAINT Combines the inverted source bitmap with the destination bitmap using the Boolean OR operator.
NOTSRCCOPY Copies the inverted source bitmap to the destination.
NOTSRCERASE Inverts the result of combining the destination and source bitmaps using the Boolean OR operator.
PATCOPY Copies the pattern to the destination bitmap.
PATINVERT Combines the destination bitmap with the pattern using the Boolean XOR operator.
PATPAINT Combines the inverted source bitmap with the pattern using the Boolean OR operator. Combines the result of this operation with the destination bitmap using the Boolean OR operator.
SRCAND Combines pixels of the destination and source bitmaps using the Boolean AND operator.
SRCCOPY Copies the source bitmap to the destination bitmap.
SRCERASE Inverts the desination bitmap and combines the result with the source bitmap using the Boolean AND operator.
SRCINVERT Combines pixels of the destination and source bitmaps using the Boolean XOR operator.
SRCPAINT Combines pixels of the destination and source bitmaps using the Boolean OR operator.
WHITENESS Turns all output white.
Christian
I have come to clean zee pooollll. - Michael Martin Dec 30, 2001
Sonork ID 100.10002:MeanManOzI live in Bob's HungOut now
|
|
|
|
|
Sorry...
Let me explain: . . .
Why Doesn't it work:
<code>void</code> OnPaint( <code>HWND </code>hWnd )
{
<code>PAINTSTRUCT </code>ps;
<code>HWND</code> hwndDesktop= ::GetDesktopWindow();
<code>HDC</code> hdcDesktop= ::GetWindowDC(hwndDesktop);
<code>HDC</code> hdcThis= ::BeginPaint( hWnd, &ps);
<code>HDC</code> hdcMem= ::CreateCompatibleDC(hdcThis);
::BitBlt(<code>hdcMem</code>, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right- ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
<code>hdcDesktop</code>, ps.rcPaint.right- ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
<code>SRCCOPY</code>);
::BitBlt(<code>hdcThis</code>, ps.rcPaint.left, ps.rcPaint.top,
ps.rcPaint.right- ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
<code>hdcMem</code>, ps.rcPaint.right- ps.rcPaint.left, ps.rcPaint.bottom - ps.rcPaint.top,
<code>SRCCOPY</code>);
::EndPaint( hWnd, &ps);
}
BTW: come to #CodeProject on DalNet (mIRC)
|
|
|
|
|
hdcMem contains a 1x1x1 bitmap, for starters. You need to select a bitmap into it.
Christian
I have come to clean zee pooollll. - Michael Martin Dec 30, 2001
Sonork ID 100.10002:MeanManOzI live in Bob's HungOut now
|
|
|
|
|
Well.. . .
I tried this
void OnPaint( HWND hWnd )
{
PAINTSTRUCT ps;
HWND hwndDesktop= ::GetDesktopWindow();
HDC hdcDesktop= ::GetWindowDC(hwndDesktop);
HDC hdcThis= ::BeginPaint( hWnd, &ps);
<code>
int nWidth= ps.rcPaint.right- ps.rcPaint.left;
int nHeight= ps.rcPaint.bottom - ps.rcPaint.top;
</code>
HDC hdcMem= ::CreateCompatibleDC(hdcThis);
<code> HBITMAP hbmpMem= ::CreateCompatibleBitmap(hdcMem, nWidth, nHeight);
HBITMAP hbmpMemOld= (HBITMAP)::SelectObject(hdcMem, hbmpMem);
</code>
::BitBlt(hdcMem, ps.rcPaint.left, ps.rcPaint.top,
nWidth, nHeight, hdcDesktop, nWidth, nHeight, SRCCOPY);
::BitBlt(hdcThis, ps.rcPaint.left, ps.rcPaint.top,
nWidth, nHeight, hdcMem, nWidth, nHeight, SRCCOPY);
<code> DeleteObject(::SelectObject(hdcMem, hbmpMemOld));</code>
::EndPaint( hWnd, &ps);
<code> ::DeleteDC(hdcMem);
::DeleteDC(hdcDesktop);
</code>}
BTW: come to #CodeProject on DalNet (mIRC)
|
|
|
|
|
::BitBlt(hdcMem, ps.rcPaint.left, ps.rcPaint.top, nWidth, nHeight, hdcDesktop, nWidth, nHeight, SRCCOPY);
You need to go from 0, 0 to nWidth nHeight, because that's the size of the bitmap. I assume you WANT to start your BitBlt from nWidth/nHeight, although obviously your window needs to be less than half the width and height of the desktop for this to work.
However, the SECOND BitBlt certainly needs to start copying from hdcMem at 0, 0 - as it stands you're starting at the point just beyond where the bitmaps exists. GDI will accept commands that are outside the bounds of the bitmap in the HDC, it will simply ignore or crop if they are partly on/partly off.
Christian
I have come to clean zee pooollll. - Michael Martin Dec 30, 2001
Sonork ID 100.10002:MeanManOzI live in Bob's HungOut now
|
|
|
|
|
I'm trying to edit the code in one of the articles here on CodeProject. It's the article that shows how to write Client/Server apps to remote a computer. But when trying to connect to the server (the app) on the server in our network (the computer) it doesn't looks like it (teh server app) can't find the IP. Well here is the code that perhaps is the code that assigns the IP of the current computer:
<br> local.sin_addr.s_addr = htonl(INADDR_ANY);
local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);<br>
And I don't know what INADDR_ANY do, is it the local IP? It should be!?
But on the server (the server computer) in our LAN seems to not retreve the IP (No firewall is installed, only All_Aboard) and then I tried this but it gives me an error when calling bind():
<br> local.sin_addr.s_addr = inet_addr("192.168.244.129"); local.sin_family = AF_INET;
local.sin_port = htons(DEFAULT_PORT);<br>
The error code is:
WSAEADDRNOTAVAIL
(10049)
Cannot assign requested address.
The requested address is not valid in its context. This normally results from an attempt to bind to an address that is not valid for the local machine. This can also result from connect, sendto, WSAConnect, WSAJoinLeaf, or WSASendTo when the remote address or port is not valid for a remote machine (for example, address or port 0).
(From MSDN Library)
CAN YOU HELP ME!!!!!!!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
First, I strongly recommend you the excellent Warren Young's Winsock Programmer's FAQ.
Now for your problem. Typically, the server bind s to INADDR_ANY (which means whatever IPs the local machine is assigned to) and the client connect s to the IP of the server. I'm afraid I don't quite understand your explanation, so I cannot say much more than this. Also, be careful not to choose any value for DEFAULT_PORT that could be already in use (best choose something greater than 1024).
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
DEFAULT_PORT = 5150
But I tried 4629, but I think it was the same error.
I try to explain again:
When you now explained the INADDR_ANY constant, I think the computer (the server in LAN) doesn't leave the right IP to INADDR_ANY, because when I use a code here from CP I can see currently TCP connections to the computer and then I can see the app server's connection with Local IP 0.0.0.0 and some other IP 0.0.0.0...
So, why I tried to assign the right IP direcly to the varible ( but the ip in the code example isn't the right IP! to be sure it listen on the right server ip.
I'll go see the faq now... thanks if you can help me!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
INADDR_ANY is actually 0.0.0.0, so don't expect to find there the IP of your local machine. What happens is that Winsock treats 0.0.0.0 in a special way, meaning "all of the IPs currently assigned to the local machine". I say "all if the IPs" because a machine can have more than one IP: for instance, if it is conencted to a LAN and also to the Internet via a modem. So, a server bound to INADDR_ANY is prepared to listen to any connect incoming request from any network the local machine is connected to. Hope this helped to clear things up a little.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Okay, then I see!
But do you have any clue on why it't can't find the server then?
Can it be but why doesn't it finds a server when I call it?... hm..
Well guess you can't help me anymore! But a big thanks for explain the INADDR_ANY constant!
It realy confused me!
------------------------------
©0d3 ©®4©k3® - That's me!
------------------------------
|
|
|
|
|
It's hard to say without more info... Have you put the server socket in listening mode with listen ?
I'd say you better formulate a new question to this forum (so that it appears on top of the list) providing more info, and, if possible, some code snippets.
Also, if you have some time spare to read the Winsock FAQ and some tutorial on sockets, I'm sure you'll find the answers to your doubts yourself.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|
|
Hi
currently I'm playing around with Mircosoft's Detours-Library, which makes it possible to detour api calls to my dll. Everything works quite fine...
but when I try to log the buffer sent through the winsock "send()" function the app calling the "send()" command crashes.
Here's a part of the code from my DLL:
int __stdcall MINE_sendto(SOCKET s, const char FAR * buf, int len, int flags, const struct sockaddr FAR * to, int tolen )
{
if(file != NULL)
{
char buffer[128];
sprintf(buffer,"send() called:\r\n%s\r\n",buf);
fwrite(buffer,sizeof(char),strlen(buffer),file);
}
return REAL_sendto(s, buf, len, flags, to, tolen );
}
If I comment out the line "sprintf(buffer..." everything works fine, i.e. the problem must be there, but where is the problem actually?
regards
Gregor
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Gregor S. wrote:
sprintf(buffer,"send() called:\r\n%s\r\n",buf);
Is buf is zero-terminated?
--Mike--
My really out-of-date homepage
"Hey, you wanna go to the Espresso Pump and get sugared up on mochas?"
-- Willow Rosenberg
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
that's a good question...doesn't it depend on the app calling the "send()" function?
Is there an easy way to find out whether it is zero-terminated?
And must "buf" be zero-terminated?
questions over questions
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Gregor S. wrote:
And must "buf" be zero-terminated?
sprintf(buffer,"send() called:\r\n%s\r\n",buf);
buf is being treated as a string (the %s format), so it had better be zero-terminated. If you can't guarantee this, then you'll need to go by the length parameter and only access that many characters in buf .
--Mike--
My really out-of-date homepage
"Hey, you wanna go to the Espresso Pump and get sugared up on mochas?"
-- Willow Rosenberg
Sonork - 100.10414 AcidHelm
Big fan of Alyson Hannigan.
|
|
|
|
|
Michael Dunn wrote:
If you can't guarantee this, then you'll need to go by the length parameter and only access that many characters in buf.
could you please explain what you mean?
modified 12-Sep-18 21:01pm.
|
|
|
|
|
if you have a byte array that is zero terminated you call it a null terminated string and you can use stuff like sprintf, strcpy, strcmp etc. on it.
But if you are simply using a sequence of chars with no NULL at the end some of these functions will give you problems.
That's cause these functions all go character by character till they reach a null. I can even imaginre some code like
while(*src && *dest)
{
//do stuff here
}
Got it now?
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
If you don't find me on CP, I'll be at Bob's HungOut
|
|
|
|
|
Gregor S. wrote:
could you please explain what you mean?
If you are not sure if buf ends with \0, then you must at least know its length to use it. Otherwise, you may try to access out-of-bound elements.
If you know the length of buf, then you can use the following approach:
char *sNewBuf = new char (length + 1);
memcpy (sNewBuf, buf, length);
sNewBuf [length] = '\0';
sprintf(buffer,"send() called:\r\n%s\r\n",sNewBuf);
delete sNewBuf;
This may not be the best way, but it should work!
Kind regards
Mustafa Demirhan
http://www.macroangel.com
Sonork ID 100.9935:zoltrix
|
|
|
|
|
I don't care whether it's the best way
The most important thing is that it works perfect!!!!
Thanks!
modified 12-Sep-18 21:01pm.
|
|
|
|
|
Hi Gregor,
Dont forget to correct my code. Here is the fixed one:
char *sNewBuf = new char [length + 1];
memcpy (sNewBuf, buf, length);
sNewBuf [length] = '\0';
sprintf(buffer,"send() called:\r\n%s\r\n",sNewBuf);
delete [] sNewBuf;
Sorry for my carelessness
Kind regards
Mustafa Demirhan
http://www.macroangel.com
Sonork ID 100.9935:zoltrix
|
|
|
|
|
Hmmm, I took a close look at your code and noticed a nasty bug in it. This line:
char *sNewBuf = new char (length + 1);
Should actually be:
char *sNewBuf = new char [length + 1];
Otherwise you end up allocating a pointer to a single character set to the ASCII value corresponding to length + 1.
This also means that the delete statement should be changed to:
delete [] sNewBuf;
Note that the code may actually work as you have it, but your memcpy is overwriting "foreign" memory which may or may not be allocated for other purposes - in other words, you're asking for trouble.
Regards,
Alvaro
|
|
|
|
|
|