|
I have a application, where on clicking on minimize button it should minimise to system tray and on clicking right button it should pop up a menu. Get i have that piece of code.
void CXTransferDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
DWORD dwMsg = NIM_ADD;
if (nID == SC_MINIMIZE)
{}
where i need to add the piece of code in the minimize loop
|
|
|
|
|
|
Is there any way to pass the size of an array using a command prompt.
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[ argv[1] ];
return 0;
}
modified 29-Jan-21 21:01pm.
|
|
|
|
|
Arguments come as an array of char * - that's the argv variable. One way to convert them is :
int size = atoi( argv[1] );
|
|
|
|
|
Now consider this code
#include <iostream>
using namespace std;
class cls
{
private:
int arr[len];
public:
int len;
void print_arr();
};
int main(int argc, char *argv[])
{
cls obj;
obj.len = atoi( argv[1] );
obj.print_arr();
return 0;
}
void cls::print_arr()
{
for (int i = 0; i < len; i++)
{
arr[i] = i;
cout << arr[i] << " ";
}
}
Getting errors
error: ‘len’ was not declared in this scope
error: ‘arr’ was not declared in this scope
modified 29-Jan-21 21:01pm.
|
|
|
|
|
The array needs to be dynamically allocated. This is done using the new operator. I usually prepend an "m_" to member variable names so I know that is what they are. The array will be allocated in the class constructor and released in the destructor.
class cls
{
private:
int * m_array;
public:
int m_length;
cls( int length );
~cls();
void print_array();
};
cls::cls( int length )
{
m_length = length;
m_array = new int[length];
}
cls::~cls()
{
delete [] m_array;
m_array = nullptr;
}
int main(int argc, char *argv[])
{
int length = atoi( argv[1] );
cls obj( length );
obj.print_array();
return 0;
}
|
|
|
|
|
Thanks
modified 29-Jan-21 21:01pm.
|
|
|
|
|
Consider also using a vector<int>[^], instead of a C-like array.
|
|
|
|
|
Hi
I want to limit the number of characters on a line in a multiline edit control
I figured I would do CEdit::linelength and divide that by rect.right
From getclientrect that would get me the number of pixels per character
I would then multiply it by the number of characters I want on a line however
Cedit:Linelength return zero
my edit control is declared CEdit mycontrol
I know under the covers it does a SendMessage EM_LINELENGTH
Is there a issue that I dont have a message map
The character index is 0
|
|
|
|
|
Did you pass a valid line number to it like 0? If you pass it -1 "the return value is the number of unselected characters in the lines that contain selected characters" according to the documentation.
You will have to do the length limiting of each line yourself because LimitText and SetLimitText define how many total characters the control can accept, not just on one line.
Also, to get the number of pixels per character you should call GetTextExtent which is a member of the CDC class. The typical way is to generate a string with all upper and lower case letters, call GetTextExtent with that string, and then divide the resulting width by the string length to get an average for each character. There are lots of examples that show how to do this.
|
|
|
|
|
I did pass 0 is the index and still it returned 0
I do use The GetTextExtent but thought that LineLength would be easier
This is the code I used to figured out how much space I needed per line I was looking to allow the user up to 8 hex characters (by that I mean 0 -F )
It just didn't come up exactly the way I figured
CSize mycsize = gprdc->GetTextExtent(_T("0123456789ABCDEF"), 16);
mycsize.cx = mycsize.cx / 16;
RECT gprrect, gprrect1, accessrect;
WINDOWINFO dlgwin;
GetWindowInfo(&dlgwin);
asidgprs.GetWindowRect(&gprrect);
asidaccess.GetWindowRect(&accessrect);
int height = gprrect.bottom - gprrect.top;
gprrect.left = (gprrect.left - dlgwin.rcWindow.left) + dlgwin.cxWindowBorders;
accessrect.left = (accessrect.left - dlgwin.rcWindow.left) + dlgwin.cxWindowBorders;
gprrect.top = gprrect.top - ( dlgwin.rcWindow.top + dlgwin.cyWindowBorders + 20) ;
accessrect.top = accessrect.top - ( dlgwin.rcWindow.top + dlgwin.cyWindowBorders + 20);
gprrect.bottom = ( gprrect.top + height) -20 ;
accessrect.bottom = (accessrect.top + height) - 20;
gprrect.right = gprrect.left + (mycsize.cx * 10);
accessrect.right = accessrect.left + (mycsize.cx * 10);
mycsize.cx represents the number of pixels per character originally I multiplied by 8 figuring 8 characters per line but I ended up multiplying by 10 to get 8 characters to fit
asidgprs and asidacess are 2 multiline edit controls in the Dialog
I ended doing a lot tweeking wit this to get it to the right size
|
|
|
|
|
Is there a reason you need to use multi-line edit controls of a fixed width? It seems like an array of single line edit controls might do what you need and it is easier to limit the length of data in them.
|
|
|
|
|
If they are all adjacent to each other they look like multi line ?
|
|
|
|
|
This message returns the length of the existing text at that line, not the amount of space available. How many characters are in the control when you call this?
|
|
|
|
|
Thanks that’s it I wanted to calculate the number of characters the control can hold on a line
|
|
|
|
|
ForNow wrote: I wanted to calculate the number of characters the control can hold on a line
It depends on the font your control is currently using.
|
|
|
|
|
|
If your current font is a "proportional" one (like Arial, Times New, ...) then it is not possible to calculate the number of characters in a line in a common case.
It will always depend of the text itself. Example:
the text "WWW" needs much more pixels than "111".
But for non-proportional fonts (like Courier New) both need the same number of pixels.
|
|
|
|
|
I understand that this is the font statement from resource file dialog definition "FONT 8, "MS Shell Dlg", 400, 0, 0x1" I basically editing for hex characters so my GetTTextExtent string is "0123456789ABCDEF" these characters seem like the size even without a Font like courier new
|
|
|
|
|
That's a proportional font, a 1 will take far less space than an E. If spacing is important then you should use a fixed font in your edit control.
|
|
|
|
|
Have you considered deriving your own class from CEdit, something like:
class MyCustomEdit : public CEdit
{
} Then as each character is typed into the control but before the control is updated, figure out what line the cursor is on (I haven't used MFC in a few years so I'm not sure what these two messages would be). If there is room, let the character through, otherwise not.
"One man's wage rise is another man's price increase." - Harold Wilson
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
"You can easily judge the character of a man by how he treats those who can do nothing for him." - James D. Miles
|
|
|
|
|
probably WM_CHAR and wparam is the keystroke truth that would also save me time on the editing as I can see if it is a valid hex character was entered rather then do GetWindowText to read the entire control
Thanks
|
|
|
|
|
This class may provide all the functionality of a DDV macro
|
|
|
|
|
HI,
I'm updating my C++ application in to multi thread application in VisualStudio 2013.
In main(), thread's was created by CreateThread()and inside the thread's classA ObjA(); was created & called the function.
In the classA it call another dll method.
Dll was include in to the project through properties->Linker.
Problem was when objA called dll method , application throws access violation reading location.
But without multi-thread it works normal.
Accessing dll method from multi-thread is same way as normal or any other things needed for accessing.
Thanks in Advance.
|
|
|
|
|
You need to use the debugger to check exactly what caused the access violation. Are you sure the DLL is totally thread-safe?
|
|
|
|